我的代码如下所示(删除了与问题无关的属性):
public class Stock
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<StockProperty> StockProperties { get; set; }
}
public class StockProperty
{
[Key, Column(Order = 0)]
public int StockId { get; set; }
[Key, Column(Order = 1)]
public int PropertyId { get; set; }
public IList<StockPropertyValue> Values { get; set; }
public virtual Property Property { get; set; }
public virtual Stock Stock { get; set; }
}
public class StockPropertyValue
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
public class Property
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<StockProperty> StockProperties { get; set; }
}
使用此代码,我在StockPropertyValues表中获得了两个外键,Stock_Id和Property_Id。我可以向StockProperty添加一个显式主键,这将在StockPropertyValues表中为我提供StockPropertyId的外键。 StockProperties确实拥有它自己的一些额外数据。这些不同配置的优缺点是什么?
答案 0 :(得分:0)
您在此处展示的方法的优势在于,您可以对StockId和PropertyId的任何组合开箱即用。使用StockProperties的单个主键,您必须自己配置一个唯一约束。在缺点方面,如果您需要显式访问StockPropertyValues中的外键,则需要注释或流畅的API。此外,我发现一些为表创建自动UI的工具(例如LightSwitch,但现在可能已经改变)无法处理复合外键。