如何在Entity Framework中仅引用具有多对多关系的ID?

时间:2012-08-06 14:33:11

标签: c# entity-framework

我有这个聚合根

CustomerGroup
int Id
string Name
Customer[] Customers

这一个

Customer
int Id
string Name

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

CustomerGroup
int Id
string Name
int[] Customers

你会怎么做?

客户可能在很多人(多对多的关系)中,但我只需要单向关系 - >顾客。我没有任何需要客户的用例 - >基。

2 个答案:

答案 0 :(得分:1)

由于您在CustomerCustomerGroup之间存在多对多关联,因此还有一个所谓的联结表,比如说CustomerGroupCustomer,它有CustomerIdCustomerGroupId

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

但是,由于您只对CustomerId感兴趣,因此您可以决定定期进行一对多关联CustomerGroup.CustomerGroupCustomers。如果您解决此导航属性,则只需要一个连接,并且查询非常轻松。如果您有CustomerGroup个实例,则可以

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

,只会查询CustomerId

如果您愿意,可以直接通过

获取Customers
group.CustomerGroupCustomers.Select(c => c.Customer)

答案 1 :(得分: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(); }
}