2017-05-16 23 views
0

C#、.NET Framework 4.0およびEntity Frameworkコードファースト6.1.3でライブラリを開発しています。複合外部キーとの1..n関係のエラー

私はEFを使用しようとすると、私はこのエラーを取得:

VariableData_AggregationLevelConfiguration_Source:多重度は 'VariableData_AggregationLevelConfiguration_Source' 関係の「VariableData_AggregationLevelConfigurationの役割に有効な ではありません。 従属ロールはキープロパティを参照するため、 の上限は、依存ロールの多重度は「1」でなければなりません。

は、私はこれをデザインしたい:

ProductionOrderは、1つまたは複数のAggregationLevelConfigurationを持つことができます。
AggregationLevelConfigurationは、0以上の数値を持つことがあります。VariableData
ProductionOrderは、1つまたは複数のVariableDataを持つことができます。

これらはクラスである:

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; } 
} 

そして、これらは、設定クラスです:

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); 
    } 
} 

しかし、私はそれが正しいことだと思います。

何が間違っていますか?または、この問題を解決するにはどうすればよいですか?

答えて

0

あなたはこのような主キーを使用して、多くの関係1を持つことはできません。

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

AggregationLevelConfigurationId, ProductionOrderIdAggregationLevelConfigurationであなたの主キーであるので、あなただけの1対1の関係を持つことができます(従っEFへ)。 ForeignKeyInVariableDataAggregationLevelConfigurationの主キー(またはおそらく主キーの一部でも)ではありません

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

:何をする必要があると、このようなものです。

+0

ありがとうございました。私の最初のバージョンでは、 'VariableData'のプライマリは、' HasKey(vd => new {vd.AggregationLevelConfigurationId、vd.ProductionOrderId、vd.VariableDataId}) 'でしたが、試してみると別のエラーが出ました'AggregationLevelConfiguration'への外部キーを作成します。多分、エラーは '.HasForeignKey'の列の順番であったでしょう。 – VansFannel

関連する問題