C# EF编码首先使用有效负载、复合键或代理键进行多对多编码

C# EF编码首先使用有效负载、复合键或代理键进行多对多编码,c#,sql,entity-framework,database-design,C#,Sql,Entity Framework,Database Design,我想实现以下模型: 我的代码如下所示(删除的属性与问题无关): 公共类股票 { [数据库生成(DatabaseGeneratedOption.Identity)] 公共int Id{get;set;} 公共虚拟ICollection StockProperties{get;set;} } 公共类股票资产 { [键,列(顺序=0)] public int StockId{get;set;} [键,列(顺序=1)] 公共int属性ID{get;set;} 公共IList值{get;set;} 公共虚

我想实现以下模型:

我的代码如下所示(删除的属性与问题无关):

公共类股票
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
公共虚拟ICollection StockProperties{get;set;}
}
公共类股票资产
{
[键,列(顺序=0)]
public int StockId{get;set;}
[键,列(顺序=1)]
公共int属性ID{get;set;}
公共IList值{get;set;}
公共虚拟财产属性{get;set;}
公共虚拟股票{get;set;}
}
公共类StockPropertyValue
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
}
公共类财产
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
公共虚拟ICollection StockProperties{get;set;}
}

通过这段代码,我在StockPropertyValues表中得到了两个外键,Stock_Id和Property_Id。我可以向StockProperty添加一个显式主键,这将在StockPropertyValues表中为我提供一个StockPropertyId外键。StockProperties本身也有一些额外的数据。这些不同配置的优缺点是什么

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

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; }
}