2010-11-08 86 views
1

下午好一切,许多一对多在EF与在关联表数据字段

关系我有三个表安排做一个多对多的关系(联系人,定单和PO_Contact)。 PurchaseOrder表最终将代表每个购买订单(每个订单只有一个实例)。每个客户可以与任意数量的PurchaseOrders关联,并且每个Purchase Order可以与任意数量的联系人关联。但是,对于每个联系人,都可以有一个采购订单,即该联系人的主要采购订单。

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

科里斯

Contact/PO diagram

Contact/PO EDMX Diagram

回答

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“类。

+0

那么我目前有概念模型设置,以便采购订单作为关联实体(多对多)与联系人。在存储模型中,我描述了Contact_PO。这是否如此,如果是这样,我将如何获得IsPrimary属性,或者是否需要在概念模型中以某种方式描述Contact_PO表。有一次,我想创建一个Contact_PO和PurchaseOrders表的视图并映射它,但还没有做到这一点。这会是一个更好的行动?将尝试在原始文章中张贴EDMX的图像。 – CodeWarrior 2010-11-08 22:10:33

+0

你是如何创建EDMX的?你是从DB生成的,还是手动添加实体?如果您想要IsPrimary字段,则必须映射联结表。将IsPrimary字段移动到“联系人”表格怎么样?有一个字段(FK - 可为空),称为“PrimaryPurchaseOrder”。这足够吗?如果您希望购买实体,您必须映射交汇表。 – RPM1984 2010-11-08 22:58:54

+0

我创建Model-first的大多数EDMX然后从中生成数据库并在稍后修改。对于PO和Contact_PO表,我创建了这些表,然后手动添加。我想在这种情况下,我会继续并绘制交界表。我将不得不看看模型明智的形式。这可能是一种奇怪的看法,即将PO编号托管在实体中与主布尔值分离。我可能不得不采取一些方法来合并它们。自动取款机我不知道那将会发生什么。 – CodeWarrior 2010-11-09 01:47:01