【问题标题】:Many-To-Many relationship in EF with a datafield in the Association tableEF 中的多对多关系与关联表中的数据字段
【发布时间】:2010-11-08 20:54:36
【问题描述】:

我安排了三个表来建立多对多关系(Contacts、PurchaseOrder 和 PO_Contact)。 PurchaseOrder 表最终将代表每个purchaseorder(每个仅一个实例)。每个客户可以与任意数量的采购订单相关联,并且每个采购订单可以与任意数量的联系人相关联。但是,对于每个联系人,都可以有一个采购订单作为该联系人的主要采购订单。

我试图弄清楚如何将它添加到我的 EntityModel 中,但我做不到。最终,我想要一个 PO 对象的集合,其中一个被描述为主要对象,但我不知道如何实现它。有人有这方面的经验吗?请在下面找到受影响表的数据库图表。

【问题讨论】:

    标签: entity-framework many-to-many


    【解决方案1】:

    联结表的问题在于,如果实体框架仅包含相邻表的 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”类。

    【讨论】:

    • 嗯,我目前有概念模型设置,以便采购订单显示为与联系人关联的实体(多对多)。在存储模型中,我描述了 Contact_PO。是这样吗?如果是这样,我将如何获得 IsPrimary 属性,或者我是否需要在概念模型中以某种方式描述 Contact_PO 表。有一次我想过创建一个 Contact_PO 和 PurchaseOrders 表的视图并映射它,但还没有实现。那会是更好的行动方案吗?将尝试在原始帖子中发布 EDMX 的图像。
    • 您是如何创建 EDMX 的?您是从数据库生成的,还是手动添加实体?如果您想要 IsPrimary 字段,则必须映射联结表。将 IsPrimary 字段移动到“联系人”表怎么样?有一个名为“PrimaryPurchaseOrder”的字段(FK - 可为空)。这样就够了吗?如果您想在购买实体上使用它,则必须映射联结表。
    • 大部分 EDMX 我先创建模型,然后从中生成数据库,然后稍作修改。对于 PO 和 Contact_PO 表,我创建了这些表,然后手动添加。我想在这种情况下,我将继续绘制连接表。我将不得不看看采用模型的形式。将 PO 编号托管在与 Primary 布尔值分开的实体中可能有点奇怪。我可能不得不想办法把它们结合起来。 ATM 我不知道这会带来什么。
    • 是的,有很多方法可以做到这一点。如果您正在编写一个 legacy 数据库,那么您应该从数据库生成模型。如果您没有数据库,那么您应该先做模型并尝试正确地为您的域建模。这是一个全新的应用程序吗?您是否查看过模型的继承? (例如 TPH - 主要/次要订单具有单独的实体)。它仍然表示为数据库中的一个物理表,但您可以通过模型轻松找到主订单:Orders.OfType<PrimaryOrder>()
    • 这是我针对新 SQL2008 数据库编写的新应用程序。这最终将与 ACT 交互!数据库(一团糟)。我正在尝试保留一个包含不同 PO 编号值的表(以便与 ACT!DB 的交互更顺畅),同时允许多对多关系。我绝不是 DB 大师。我仍然在学习。本质上,我希望将联系信息同步到 ACT! db(通过 ACT 插件通过主 PO 编号值)。我认为最好有办法用 ACT 一对一地定义 PO 记录。
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2015-04-23
    • 2017-08-25
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多