Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ddd中聚合根模式中具有Id的C#复合键。为什么?_C#_Asp.net Mvc_Entity Framework_Domain Driven Design_Aggregation - Fatal编程技术网

在ddd中聚合根模式中具有Id的C#复合键。为什么?

在ddd中聚合根模式中具有Id的C#复合键。为什么?,c#,asp.net-mvc,entity-framework,domain-driven-design,aggregation,C#,Asp.net Mvc,Entity Framework,Domain Driven Design,Aggregation,我们正在使用ASP.NETMVC和EF6.2。 我们有订单和商品,我的同事建议采用这种方法 public class Order { public int Id { get; set; } public virtual ICollection<OrderItem> Items { get; set; } } public class Item { public int Id { get; set; } } public class OrderIte

我们正在使用ASP.NETMVC和EF6.2。 我们有订单和商品,我的同事建议采用这种方法

public class Order
{
    public int Id { get; set; }   
    public virtual ICollection<OrderItem> Items { get; set; } 
}

public class Item
{
    public int Id { get; set; }
}

public class OrderItem
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(Order = 0)]        
    public int Id { get; set; }    

    [Key, Column(Order = 1)]
    public int OrderId { get; set; }
    public Order Order { get; set; 

    public int ItemId { get; set; }
    public virtual Item Item { get; set; }    

    public int Quantity { get; set; }
}
公共类秩序
{
公共int Id{get;set;}
公共虚拟ICollection项{get;set;}
}
公共类项目
{
公共int Id{get;set;}
}
公共类OrderItem
{
[键,DatabaseGenerated(DatabaseGenerateOption.Identity),列(顺序=0)]
公共int Id{get;set;}
[键,列(顺序=1)]
公共int-OrderId{get;set;}
公共秩序{get;set;
公共int ItemId{get;set;}
公共虚拟项项{get;set;}
公共整数数量{get;set;}
}

现在我们有了一个复合键(Id和OrderId)来执行不变量。我不明白这一点,我认为我们可以在OrderId(PK,FK)和ItemId(PK,FK)上使用复合键来实现这一点。有人能帮我清除这个吗?谢谢。

这几乎是正确的。父键应该放在第一位。例如:

[Key, Column(Order = 0)]
public int OrderId { get; set; }

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(Order = 1)]        
public int Id { get; set; }    

此设计的要点是将每个订单的OrderItem行存储在一起,这样它们的存储和检索成本更低,并最大限度地减少此表所需的索引数。此设计只需要一个聚集索引,所有备选方案都需要一个单独的主键和外键索引。

最正确。父项应位于第一位。例如:

[Key, Column(Order = 0)]
public int OrderId { get; set; }

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(Order = 1)]        
public int Id { get; set; }    

此设计的要点是将每个订单的OrderItem行存储在一起,以使它们的存储和检索成本更低,并最大限度地减少此表所需的索引数。此设计只需要一个聚集索引,所有备选方案都需要主键和外键的单独索引。

但不是e是否需要Id字段?是的,问题基本上是Id和OrderId的复合键是否比ItemId和OrderId的复合键有任何优势。我假设一个订单上的多个OrderItems可能是同一个项。因此“子表”不是多对多链接表。但问题不在于是否需要Id字段吗?是的,问题基本上在于Id和OrderId的复合键是否比ItemId和OrderId的复合键有任何优势。我假设订单上的多个OrderItems可以是同一个项。因此“子表”不是多对多链接表。