2013-04-02 148 views
0

我很困惑實體框架處理聯接表的方式,特別是因爲實體框架要求聯接表具有由兩個相關實體上的主鍵組成的組合鍵我想要保持關係。這裏的問題是我需要與這種關係保持一種關係。實體框架 - 使用組合鍵和主鍵聯接表

這可能是我的數據庫設計的問題,或者是因爲我對EF的理解不夠。這可能是最好的例子說明(見下文);

我各有三個表具有主鍵: -

Table : DispatchChannel 
{ *DispatchChannelID integer } 


Table : Format 
{ *FormatID integer } 


Table : EventType 
{ *EventTypeID integer } 

事件類型和DispatchChannels之間的關係在EventTypeDispatchChannels(見下文)舉行,因爲這不僅包含它不是通過拉成複合鍵我們模型和實體框架負責維護關係。

Table : EventTypeDispatchChannels 
{ EventTypeID integer, DispatchChannelID integer 
} 

我現在的問題出現,因爲EventTypeID和DispatchChannelID的每一個組合我想擁有可用格式的列表,這將是容易的,如果我EventTypeDispatchChannels表有一個主鍵,因此我的其他的連接表是這樣的;

Table : EventTypeDispatchChannelFormats 
{ EventTypeDispatchChannelID integer, FormatID integer 
} 

缺乏對EventTypeDispatchChannels主鍵的是我很努力,使這項工作,但是如果我有鑰匙,然後實體框架不再認爲這是一個鏈接的實體。

我對C#相對來說比較陌生,所以如果我沒有很好地解釋這一點,我會很感激。

回答

0

當你想給一個關聯一個更重要的角色而不僅僅是作爲兩個類之間的一段字符串時,這個關聯就成爲你的域的一級公民,並且把它作爲類模型的一部分是合理的。這也是不可避免的,但這是次要的。

所以你應該將EventTypeDispatchChannels映射到一個類。除了兩個外鍵之外,該表還可以有其自己的簡單主鍵。一個類似的PK可能更容易,所以你的表Format可以用一個簡單的外鍵來做到一對多關聯的EventTypeDispatchChannels

您將失去多對多功能,只需輸入dispatchChannel.Events即可。在代替你所要做的

db.DispatchChannels.Where(d => d.DispatchChannelID == 1) 
        .SelectMany(d => d.EventTypeDispatchChannels) 
        .Select(ed => ed.Event) 

在另一方面,你已經獲得了創建由剛剛創建EventTypeDispatchChannel並設置其原始外鍵值關聯的可能性。只能通過向集合中添加對象來設置具有透明連接表的多對多關聯(將Event添加到dispatchChannel.Events)。這意味着該集合必須加載,並且您需要一個對象,這在數據庫往返中更加昂貴。

+1

非常感謝您的回覆,我和我的同事幾乎已經得出了這個結論,但想要澄清一下。非常感激 –