EF 代码首先使用有效负载、复合键或代理键进行多对多
Posted
技术标签:
【中文标题】EF 代码首先使用有效负载、复合键或代理键进行多对多【英文标题】:EF code first many to many with payload, compound key or surrogate key 【发布时间】:2016-01-09 01:20:36 【问题描述】:我要完成以下模型:
我的代码如下(删除了与问题无关的属性):
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 确实有一些它自己的附加数据。这些不同配置的优缺点是什么?
【问题讨论】:
【参考方案1】:您在此处展示的方法的优点是您将对 StockId 和 PropertyId 的任意组合开箱即用具有唯一约束。为 StockProperties 使用单个主键,您必须自己配置唯一约束。不利的一面是,如果您需要显式访问 StockPropertyValues 中的外键,则需要注释或流畅的 API。此外,我发现一些可以为您的表创建自动 UI 的工具(例如 LightSwitch,但现在可能已经改变)无法处理复合外键。
【讨论】:
以上是关于EF 代码首先使用有效负载、复合键或代理键进行多对多的主要内容,如果未能解决你的问题,请参考以下文章