2010-11-08 83 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