2017-05-16 2 views
0

Ich entwickle eine Bibliothek mit C#, .NET Framework 4.0 und Entity Framework Code First 6.1.3.Fehler in 1..n-Beziehung mit zusammengesetztem Fremdschlüssel

Ich bekomme diese Fehlermeldung, wenn ich versuche EF zu verwenden:

VariableData_AggregationLevelConfiguration_Source: Multiplicity ist nicht gültig in Role 'VariableData_AggregationLevelConfiguration_Source' in Beziehung 'VariableData_AggregationLevelConfiguration'. Da die abhängige Rolle sich auf die Schlüsseleigenschaften bezieht, muss die obere Grenze von die Multiplizität der abhängigen Rolle '1' sein.

Ich möchte dies entwerfen:

A ProductionOrder eine oder mehr AggregationLevelConfiguration haben könnte.
Ein AggregationLevelConfiguration könnte 0 oder mehr VariableData haben.
Ein ProductionOrder könnte einen oder mehrere VariableData haben.

Dies sind die Klassen:

public class AggregationLevelConfiguration 
{ 
    public byte AggregationLevelConfigurationId { get; set; } 
    public int ProductionOrderId { get; set; } 

    [ ... ] 

    public virtual ProductionOrder ProductionOrder { get; set; } 
    public virtual IList<VariableData> VariableData { get; set; } 
} 

public class VariableData 
{ 
    public string VariableDataId { get; set; } 
    public int ProductionOrderId { get; set; } 
    public byte AggregationLevelConfigurationId { get; set; } 

    [ ... ] 

    public virtual AggregationLevelConfiguration AggregationLevelConfiguration { get; set; } 
} 

public class ProductionOrder 
{ 
    public int ProductionOrderId { get; set; } 

    [ ... ] 

    public ICollection<AggregationLevelConfiguration> AggregationLevelConfigurations { get; set; } 

    public virtual ICollection<VariableData> VariableData { get; set; } 
} 

Und das sind die Konfigurationsklassen:

public class AggregationLevelConfigurationConfiguration : EntityTypeConfiguration<AggregationLevelConfiguration> 
{ 
    public AggregationLevelConfigurationConfiguration() 
    { 
     HasKey(agl => new { agl.AggregationLevelConfigurationId, agl.ProductionOrderId }); 

     [ ... ] 

     HasRequired(agl => agl.ProductionOrder) 
      .WithMany(po => po.AggregationLevelConfigurations); 
    } 
} 

public class VariableDataConfiguration : EntityTypeConfiguration<VariableData> 
{ 
    public VariableDataConfiguration() 
    { 
     HasKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId }); 

     [ ... ] 

     HasRequired(vd => vd.AggregationLevelConfiguration) 
      .WithMany(agl => agl.VariableData) 
      .HasForeignKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId }); 
    } 
} 

public class ProductionOrderConfiguration : EntityTypeConfiguration<ProductionOrder> 
{ 
    public ProductionOrderConfiguration() 
    { 
     HasKey(po => po.ProductionOrderId); 

     Property(po => po.ProductionOrderId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     [ ... ] 

     HasRequired(po => po.Product) 
      .WithMany(p => p.ProductionOrders) 
      .HasForeignKey(po => po.ProductId); 
    } 
} 

Aber ich denke, dass es richtig ist.

Was ist los? Oder, wie kann ich dieses Problem beheben?

HasRequired(vd => vd.AggregationLevelConfiguration) 
      .WithMany(agl => agl.VariableData) 
      .HasForeignKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId }); 

Da AggregationLevelConfigurationId, ProductionOrderId ist Ihr Primärschlüssel in AggregationLevelConfiguration, können Sie nur eine Eins-zu-Eins-Beziehung (nach:

Antwort

0

Sie keine Eins-zu-Beziehung mit einem Primärschlüssel wie diese haben kann zu EF). Was Sie tun müssen, ist so etwas wie dieses:

HasRequired(vd => vd.AggregationLevelConfiguration) 
      .WithMany(agl => agl.VariableData) 
      .HasForeignKey(vd => new { vd.ForeignKeyInVariableData }); 

Wo ForeignKeyInVariableData in AggregationLevelConfiguration kein Primärschlüssel ist (oder möglicherweise sogar ein Teil eines Primärschlüssel).

+0

Danke. In meiner ersten Version war primary in 'VariableData'' HasKey (vd => neu {vd.AggregationLevelConfigurationId, vd.ProductionOrderId, vd.VariableDataId}); 'aber ich bekam einen weiteren Fehler (ich erinnere mich nicht), als ich es versuchte Erstellen Sie den Fremdschlüssel für 'AggregationLevelConfiguration'. Vielleicht lag der Fehler in der Reihenfolge der Spalte im '.HasForeignKey'. – VansFannel

Verwandte Themen