代码之家  ›  专栏  ›  技术社区  ›  CodeWarrior

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

  •  1
  • CodeWarrior  · 技术社区  · 14 年前

    大家下午好,

    我安排了三张桌子来建立多对多关系(联系人、采购订单和采购联系人)。PurchaseOrder表最终将表示每个PurchaseOrder(每个PurchaseOrder只有一个实例)。每个客户可以与任意数量的采购订单关联,每个采购订单可以与任意数量的联系人关联。但是,对于每个联系人,可以有一个采购订单作为该联系人的主采购订单。

    我正在努力想办法把这个加到我的实体模型中,结果我就差了。最后,我希望有一个PO对象的集合,其中一个被描述为主要对象,但我不确定如何实现这一点。有人有这方面的经验吗?请在下面找到受影响表的数据库关系图。

    科里

    Contact/PO diagram

    Contact/PO EDMX Diagram

    1 回复  |  直到 14 年前
        1
  •  1
  •   RPM1984    14 年前

    连接表的问题是实体框架 如果它们只包含相邻表的FK,则必须映射它们,但是因为 一级

    最后,我想要一个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”类。