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 代码首先使用有效负载、复合键或代理键进行多对多的主要内容,如果未能解决你的问题,请参考以下文章

同一主键上的EF多个外键关系

没有主键或连接表的休眠多对一关系

ejb3:用简单的主键映射多对多关系

Fluent NHibernate 多对多映射,使用自动生成的 pk 而不是复合键

没有复合键的休眠中的多对多

外键作为主键或仅将代理主键与 JPA 上下文中的外键不同