EF中的多对多关系与关联表中的数据字段

时间:2010-11-08 20:54:36

标签: entity-framework many-to-many

下午好,

我有三个表可以建立多对多的关系(Contacts,PurchaseOrder和PO_Contact)。 PurchaseOrder表最终将代表每个采购订单(每个采购订单只有一个)。每个客户可以与任意数量的PurchaseOrders相关联,并且每个采购订单可以与任意数量的联系人相关联。但是,对于每个联系人,可以有一个采购订单,该订单是该联系人的主要采购订单。

我正在试图弄清楚如何将其添加到我的EntityModel中,并且我即将推出。最终我想要一个PO对象的集合,其中一个被描述为Primary,但我不确定如何影响它。有人有这方面的经验吗?请在下面找到受影响表格的数据库图表。

科里

Contact/PO diagram

Contact/PO EDMX Diagram

1 个答案:

答案 0 :(得分:1)

连接表的问题是,如果Entity Framework 只包含相邻表的FK,那么必须映射它们,但因为你有 IsPrimary 字段,它需要在模型上表示。

  

最终我希望拥有一个PO对象集合,其中一个被描述为主要

是的,正如我上面所说,你将不得不在物理上映射PO_Contact表,这意味着你的查询最终会像这样:

var contact = db.Contacts.SingleOrDefault(x => x.ContactId == 1);
var ordersForContact = contact.PO_Contacts.PurchaseOrders.ToList();

和此:

var order = db.PurchaseOrders.SingleOrDefault(x => x.POID == 1);
var contactsForOrder = order.PO_Contacts.Contacts.ToList();

但要找出“哪一个是主要的”? (并且可能有多个),你需要另一个过滤器。

这可能是一个示例查询:

var primaryOrdersForConactOne = db.Contacts
                                 .Where(c => c.ContactID == 1)
                                 .Where(c => c.PO_Contacts.IsPrimary)
                                 .ToList();

这应该有效。

然而,如果您的肯定只有一个主要订单可以为任何给定的客户,您可以设置一种继承形式(TPH,TPT)并使该字段成为鉴别器,所以你最终使用单独的“PrimaryOrder”和“SecondaryOrder”实体,派生自基础“PurchaseOrder”类。