1

我有这个聚合根

CustomerGroup
int Id
string Name
Customer[] Customers

和这个

Customer
int Id
string Name

我的模型是使用 EF 4 构建的。我更喜欢的是(坚持聚合根的概念)

CustomerGroup
int Id
string Name
int[] Customers

你会怎么做?

客户可能在许多组中(多对多关系),但我只需要一种方式的关系组-> 客户。我没有任何需要客户-> 组的用例。

4

2 回答 2

2

Customer由于和之间存在多对多关联,CustomerGroup因此还有一个所谓的联结表,假设CustomerGroupCustomer具有CustomerIdCustomerGroupId

如果此表只有这两个字段,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)
于 2012-08-07T08:45:25.547 回答
0

如果您刚刚创建了一个这样做的新属性怎么办?如果您使用 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(); }
}
于 2012-08-06T15:11:19.050 回答