C# 与复合外键的1..n关系中出错
我正在用C#、.NET Framework 4.0和Entity Framework Code First 6.1.3开发一个库 我在尝试使用EF时出现此错误: VariableData_AggregationLevelConfiguration_源::多重性为 在角色“VariableData\u AggregationLevelConfiguration\u Source”中无效 在关系“VariableData_AggregationLevelConfiguration”中。因为 从属角色指的是关键属性,即 依赖角色的多重性必须为“1” 我想设计这个:C# 与复合外键的1..n关系中出错,c#,entity-framework,C#,Entity Framework,我正在用C#、.NET Framework 4.0和Entity Framework Code First 6.1.3开发一个库 我在尝试使用EF时出现此错误: VariableData_AggregationLevelConfiguration_源::多重性为 在角色“VariableData\u AggregationLevelConfiguration\u Source”中无效 在关系“VariableData_AggregationLevelConfiguration”中。因为 从属角色
ProductionOrder
可以有一个或多个AggregationLevelConfiguration
AggregationLevelConfiguration
可以有零个或多个variableddata
ProductionOrder
可以有一个或多个可变数据
这些是课程:
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; }
}
公共类聚合级别配置
{
公共字节聚合levelConfigurationID{get;set;}
public int ProductionOrderId{get;set;}
[ ... ]
公共虚拟产品订单产品订单{get;set;}
公共虚拟IList VariableData{get;set;}
}
公共类可变数据
{
公共字符串变量DataId{get;set;}
public int ProductionOrderId{get;set;}
公共字节聚合levelConfigurationID{get;set;}
[ ... ]
公共虚拟聚合级别配置聚合级别配置{get;set;}
}
公共类产品订单
{
public int ProductionOrderId{get;set;}
[ ... ]
公共ICollection AggregationLevelConfiguration{get;set;}
公共虚拟ICollection 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);
}
}
公共类聚合级别配置配置:EntityTypeConfiguration
{
公共聚合级别配置配置()
{
HasKey(agl=>new{agl.AggregationLevelConfigurationId,agl.ProductionOrderId});
[ ... ]
HasRequired(agl=>agl.ProductionOrder)
.WithMany(po=>po.AggregationLevelConfiguration);
}
}
公共类VariableDataConfiguration:EntityTypeConfiguration
{
公共变量DataConfiguration()
{
HasKey(vd=>new{vd.AggregationLevelConfigurationId,vd.productionordrid});
[ ... ]
HasRequired(vd=>vd.AggregationLevelConfiguration)
.WithMany(agl=>agl.VariableData)
.HasForeignKey(vd=>new{vd.AggregationLevelConfigurationId,vd.ProductionOrderId});
}
}
公共类ProductionOrderConfiguration:EntityTypeConfiguration
{
公共产品订单配置()
{
HasKey(po=>po.ProductionOrderId);
属性(po=>po.ProductionOrderId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
[ ... ]
HASSired(采购订单=>采购订单产品)
.WithMany(p=>p.ProductionOrders)
.HasForeignKey(po=>po.ProductId);
}
}
但我认为这是正确的
怎么了?或者,如何解决此问题?您不能使用以下主键建立一对多关系:
HasRequired(vd => vd.AggregationLevelConfiguration)
.WithMany(agl => agl.VariableData)
.HasForeignKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId });
HasRequired(vd => vd.AggregationLevelConfiguration)
.WithMany(agl => agl.VariableData)
.HasForeignKey(vd => new { vd.ForeignKeyInVariableData });
由于AggregationLevelConfigurationId,ProductionOrderId
是AggregationLevelConfiguration
中的主键,因此您只能拥有一对一的关系(根据EF)。您需要做的是这样的事情:
HasRequired(vd => vd.AggregationLevelConfiguration)
.WithMany(agl => agl.VariableData)
.HasForeignKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId });
HasRequired(vd => vd.AggregationLevelConfiguration)
.WithMany(agl => agl.VariableData)
.HasForeignKey(vd => new { vd.ForeignKeyInVariableData });
其中,foreignkeyedata
不是AggregationLevelConfiguration
中的主键(甚至可能不是主键的一部分) 谢谢。在我的第一个版本中,VariableData
中的主要内容是HasKey(vd=>new{vd.AggregationLevelConfigurationId,vd.ProductionOrderId,vd.VariableDataId})
但是当我试图创建AggregationLevelConfiguration
的外键时,我遇到了另一个错误(我不记得了)。可能错误在.HasForeignKey
中的列顺序中。