【问题标题】:EF code first many to many with payload, compound key or surrogate keyEF 代码首先使用有效负载、复合键或代理键进行多对多
【发布时间】: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 确实有一些它自己的附加数据。这些不同配置的优缺点是什么?

【问题讨论】:

    标签: c# sql entity-framework database-design


    【解决方案1】:

    您在此处展示的方法的优点是您将对 StockId 和 PropertyId 的任意组合开箱即用具有唯一约束。为 StockProperties 使用单个主键,您必须自己配置唯一约束。不利的一面是,如果您需要显式访问 StockPropertyValues 中的外键,则需要注释或流畅的 API。此外,我发现一些可以为您的表创建自动 UI 的工具(例如 LightSwitch,但现在可能已经改变)无法处理复合外键。

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多