我有这个聚合根
CustomerGroup
int Id
string Name
Customer[] Customers
和这个
Customer
int Id
string Name
我的模型是使用 EF 4 构建的。我更喜欢的是(坚持聚合根的概念)
CustomerGroup
int Id
string Name
int[] Customers
你会怎么做?
客户可能在许多组中(多对多关系),但我只需要一种方式的关系组-> 客户。我没有任何需要客户-> 组的用例。
我有这个聚合根
CustomerGroup
int Id
string Name
Customer[] Customers
和这个
Customer
int Id
string Name
我的模型是使用 EF 4 构建的。我更喜欢的是(坚持聚合根的概念)
CustomerGroup
int Id
string Name
int[] Customers
你会怎么做?
客户可能在许多组中(多对多关系),但我只需要一种方式的关系组-> 客户。我没有任何需要客户-> 组的用例。
Customer由于和之间存在多对多关联,CustomerGroup因此还有一个所谓的联结表,假设CustomerGroupCustomer具有CustomerId和CustomerGroupId。
如果此表只有这两个字段,EF 可以隐式使用它,这意味着CustomerGroup可以有一个Customers集合,在映射中您指示的CustomerGroupCustomer是联结表。这是一个例子。你可以,但不是必须, map Customer.CustomerGroups。当工作数据库优先时,这种隐式行为是默认行为。
但是,由于您CustomerId只对 s 感兴趣,因此您可以决定建立一个常规的一对多关联CustomerGroup.CustomerGroupCustomers。如果您处理此导航属性,则只需要一个连接并且查询非常简单。如果你有一个CustomerGroup实例,你可以做
group.CustomerGroupCustomers.Select(c => c.CustomerId)
并且只会CustomerId查询 s 。
如果你愿意,你可以Customers直接通过做
group.CustomerGroupCustomers.Select(c => c.Customer)
如果您刚刚创建了一个这样做的新属性怎么办?如果您使用 edmx,则可以扩展部分,或者如果首先使用代码,则可以创建非映射。
public class CustomerGroup
{
public int Id { get; set; }
public string NAme { get; set; }
public Customer[] Customers { get; set; }
public int[] CustomerIds { get { return Customers.Select(c => c.Id).ToArray(); }
}