在ddd中聚合根模式中具有Id的C#复合键。为什么?
我们正在使用ASP.NETMVC和EF6.2。 我们有订单和商品,我的同事建议采用这种方法在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
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可以是同一个项。因此“子表”不是多对多链接表。