2014-04-14 41 views
1

實體框架6默認情況下,當它遇到繼承時,會創建一個具有TPH,TPT或TPC的特殊實體層次結構。但我希望EF將我的課程視爲完全獨立的實體使EF將繼承層次視爲完全獨立的實體

我有下面的類層次結構中的每個類映射到一個查看在DB:

[Table("v_Item")] 
class Item 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

[Table("v_ItemWithDescription")] 
class ItemWithDescription : Item 
{ 
    public string Description { get; set; } 
} 

這樣的設計使得在需要時能夠獲得更詳細的信息。它是如此乾燥。這也是很好的投IQueryable

IQueryable<ItemWithDescription> query = ...; 
((IQueryable<Item>) query).Where(i => i.Name == "Foo") 

但EF堅持加鑑別列,嚴重扭曲了查詢。似乎沒有辦法讓EF忘記這些類具有繼承層次結構!

將歧視列添加到視圖並切換到TPC沒有幫助,因爲在查詢中出現大量UNION。看來我唯一的選擇是修改EF源代碼,如果我想堅持我的繼承方法。有沒有更簡單的解決方案?

在此先感謝!

回答

1

如果您不映射基本實體,它將忽略繼承。因此,您可以這樣做:

爲您的Item類創建一個基類,並將所有成員拉起來。我們稱之爲ItemBase。不要映射這個類,也不要將它添加到你的DbContext

然後Item將是一個沒有任何屬性的映射類(將繼承基類中的所有內容)。讓其餘的課程(如ItemWithDescription)也延伸到ItemBase

這樣你就可以重新使用代碼,但是會失去Item及其子代之間的繼承關係,這取決於你的情況,可能會也可能不會被接受。

+0

非常感謝!這是一個幾乎完美的解決方案,適合我的需求,非常聰明的技巧既可以重用代碼,也可以放棄無用。我肯定希望只用EF來忽略它,也許有一天我會重新訪問這個代碼。 –

+0

很高興我能幫到你。 – Iravanchi