2014-12-04 72 views
0

我試圖瞭解我需要做什麼才能在外鍵在基類中不存在時在多個派生類中引入相同的外鍵。外鍵是相同的類型,我可以使各種派生類都使用相同的列名,但是當我嘗試引入外鍵註釋時,實體框架6默默無法創建任何外鍵。實體框架6多個派生類中的代碼優先TPH外鍵

值得一提的是,如果我允許EF創建Bar_Name1而不是重新使用現有列,它會適當地添加外鍵。但是我來自一個關係數據庫背景,它冒犯了我的敏感性,爲同一件事情擁有多個列。

我希望能夠堅持使用註解來標記我的代碼,但如果這是註解無法完成但可以使用Fluent API完成的事情,我願意深入研究那。

public class Foo 
{ 
    [Key] 
    public string Name { get; set; } 
} 

public class FooSub1 : Foo 
{ 
    [Required, Column("Bar_Name")] 
    public string Bar_Name { get; set; } 

    [ForeignKey("Bar_Name")] 
    public Bar Bar { get; set; } 
} 

public class FooSub2 : Foo 
{ 
    [Required, Column("Bar_Name")] 
    public string Bar_Name { get; set; } 

    [ForeignKey("Bar_Name")] 
    public Bar Bar { get; set; } 
} 

public class Bar 
{ 
    [Key] 
    public string Name { get; set; } 
} 

回答

0

分辨率爲EF issue 1964解釋道:「不過,在這裏具有S-空間關聯並不無論如何,因爲這將導致兩個數據庫的限制,只能滿足工作,如果依賴也匹配PK的其他關係類型,這種匹配通常只會偶然發生。解決的辦法是從s空間中刪除關聯,就像我們爲類似的TPC映射所做的那樣。 (強調我的)

EF將FK放在合併列上。在你的情況下,兩個FK在邏輯上是相同的,但EF不知道(或關心)。

+1

感謝您的回覆。 爲了記錄,我最終將所有的字段放在基表中的多個派生表中,並選擇爲我的應用程序創建接口來使用。通過接口限制底層對象的可用性是非常容易的,這可能是一種更好的方式來處理所有事情。 – 2014-12-05 21:04:05