2012-08-06 77 views
1

我有这个聚合根如何仅在实体框架中引用具有多对多关系的ID?

CustomerGroup 
int Id 
string Name 
Customer[] Customers 

而这一次

Customer 
int Id 
string Name 

我的模型是使用EF 4.什么我宁愿将是(对坚持聚合根的概念)内置

CustomerGroup 
int Id 
string Name 
int[] Customers 

你会如何做到这一点?

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

+0

一些问题得到Customers:为什么要'CustomerGroup'是聚合根?它可能不是“客户”聚合的一部分吗?你会不会需要一系列的客户ID _only_?难道它不是为了找到客户吗?为什么不立即使用“客户”收藏? – 2012-08-06 15:28:22

+0

因为在我的软件中,我们需要能够向CustomerGroup销售服务(如果组更改,那么产品将仅适用于此组中的客户)。有一个用于编辑组和许多GUI的GUI,我们只使用没有客户的组的概念,所以我确信它是一个聚合根。 – 2012-08-06 15:47:59

+0

这只能确认'Customer'和'CustomerGroup'是紧密聚合的。我的意思是:没有'客户'没有'客户组',反之亦然。我认为这是任意的,哪一个是聚合根。但是这是一个相应的决定吗?也许你应该扩大一点。我感到我们并没有在讨论问题的核心。 – 2012-08-06 19:36:36

回答

1

当你有CustomerCustomerGroup也存在所谓的结台之间的许多一对多的关联,让我们说CustomerGroupCustomer,有CustomerIdCustomerGroupId

如果这个表只有这两个字段EF可以隐式使用它,这意味着CustomerGroup可以有一个Customers集合,其中在映射您指示CustomerGroupCustomer是结表。 Here就是一个例子。你可以,但不必,地图Customer.CustomerGroups。在使用数据库优先时,这种隐式行为是默认行为。

但是,既然您只对CustomerId感兴趣,只有您可以决定建立一个普通的一对多关联CustomerGroup.CustomerGroupCustomers。如果您处理此导航属性,则只需要一次连接,查询非常轻便。如果你有一个CustomerGroup比如,你可以做

group.CustomerGroupCustomers.Select(c => c.CustomerId) 

,只有CustomerId旨意进行查询。

如果你愿意,你可以直接通过做

group.CustomerGroupCustomers.Select(c => c.Customer) 
+0

谢谢!我现在得到它 – 2012-08-07 08:48:55

+0

在这里,如果我创建一个CustomerGroupCustomers,我必须初始化它的外键“GroupId”,或者有一种方式说“你从你所在的组中取得这个ID”。 – 2012-08-07 09:28:52

+0

是的,只需将CustomerGroupCustomers对象添加到CustomerGroup中的集合即可。 EF将管理Id。 – 2012-08-07 09:31:22

0

如果您刚刚创建了一个新属性,该怎么做?如果您使用edmx,则可以扩展partial,或者先使用代码创建非映射。

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(); } 
} 
+0

我正在使用edmx。但是,您的解决方案意味着它只会在需要ID时加载所有客户信息! – 2012-08-06 15:17:57

+0

你可以通过添加一个edmx作为partial来使用它。你是正确的,它会加载所有的客户信息,但你不需要吗?如果在加载客户组时包含客户,则客户已存储在内存中,并且不会有额外的sql调用来收集数据。您的客户对象是否非常大,因此您试图避免加载它们? – 2012-08-06 15:47:14

+0

客户<->集团我是一个多对多的关系,所以我只需要客户Id,而不是名称或其他东西。 – 2012-08-06 15:50:45