Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF中的多对多关系与关联表中的数据字段_Entity Framework_Many To Many - Fatal编程技术网

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

Entity framework EF中的多对多关系与关联表中的数据字段,entity-framework,many-to-many,Entity Framework,Many To Many,我有三个表,用于建立多对多关系(Contacts、PurchaseOrder和PO_Contact)。PurchaseOrder表最终将表示每个PurchaseOrder(每个PurchaseOrder只有一个实例)。每个客户可以与任意数量的采购订单关联,并且每个采购订单可以与任意数量的联系人关联。但是,对于每个联系人,可以有一个作为该联系人的主PO的采购订单 我正试图找出如何将其添加到我的整个模型中,但我的结果很差。最终,我希望有一个PO对象集合,其中一个对象被描述为主要对象,但我不确定如何实

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

我正试图找出如何将其添加到我的整个模型中,但我的结果很差。最终,我希望有一个PO对象集合,其中一个对象被描述为主要对象,但我不确定如何实现这一点。有人有这方面的经验吗?请在下面找到受影响表的数据库关系图


连接表的问题是,如果实体框架仅包含相邻表的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”派生类。

连接表的问题是,如果实体框架只包含相邻表的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”派生类。

我目前有概念模型设置,以便采购订单显示为与联系人关联的实体(多对多)。在存储模型中,我已经描述了联系人。如果是这样的话,我将如何获得IsPrimary属性,或者我需要在概念模型中以某种方式描述Contact_PO表。我曾经考虑过创建Contact_PO和PurchaseOrders表的视图,并将其映射,但现在还没有做到这一点。这是一个更好的行动方案吗?将尝试在原始帖子中发布EDMX的图像。您是如何创建该EDMX的?您是从DB生成的,还是手动添加实体?如果需要IsPrimary字段,则必须映射连接表。将iPrimary字段移动到“Contact”表如何?有一个名为“PrimaryPurchaseOrder”的字段(FK-nullable)。这样就够了吗?如果您想在purchase实体上使用它,您必须映射连接表。我首先创建的大多数EDMX模型都是从中生成DB,然后再进行一些修改。对于PO和Contact_PO表,我创建了这些表,然后手动添加。我想在这种情况下,我将继续绘制连接表。我将不得不看看采用何种形式的模型。将PO编号托管在与主布尔值分离的实体中可能有点像wierd。我可能得想办法把它们结合起来。我不知道这需要什么。是的,有很多方法可以做到这一点。如果是针对遗留数据库编写,那么应该从数据库生成模型。如果您没有数据库,那么您应该首先进行建模,并尝试正确地建模您的域。这是一款全新的应用程序吗?你看过你的模型的继承吗?(例如,TPH-主要/次要订单有单独的实体)。它仍然在数据库中表示为一个物理表,但您可以通过模型轻松找到主订单:
orders.OfType()
。这是我针对新的SQL2008数据库编写的一个新应用程序。这将最终与一个行为互动!数据库(真是一团糟)。我试图保留一个包含不同PO编号值的表(以便与ACT!DB的交互更加顺畅),同时允许多对多关系。我决不是DB大师;我仍然在学习。基本上,我希望发生的是联系信息同步到行动!db(通过ACT插件通过主PO编号值)。我认为用ACT一对一定义采购订单记录是最好的方法。我目前有概念模型设置,以便采购订单显示为与联系人关联的实体(多对多)。在存储模型中,我已经描述了联系人。如果是这样的话,我将如何获得IsPrimary属性,或者我需要在概念模型中以某种方式描述Contact_PO表。我曾经考虑过创建Contact_PO和PurchaseOrders表的视图,并将其映射,但现在还没有做到这一点。这是一个更好的行动方案吗?将尝试在原始帖子中发布EDMX的图像。您是如何创建该EDMX的?您是从DB生成的,还是添加了e