2016-02-16 82 views
1

給定下面的示例結構,實體框架無法識別基礎Entity繼承,因此不會將其映射爲用戶和實體之間的TPT繼承。強制實體框架識別TPT繼承結構

// Where DbSet<User> Users { get; set; } is used 
public class User : User<int> { } 

public class User<TTest> : Entity { 
    public TTest Whatever { get; set; } 
} 

public abstract class Entity { 
    public int EntityId { get; set; } 
} 

我相信這是因爲EF只會看第一級繼承結構和永遠看不到Entity作爲基類,只是它有它的特性。

所以我的問題是,我如何強制EF認識到該實體確實是基類?只是在遷移中定義該用戶具有ForeignKey to Entity顯然是不夠的,因爲它仍然不會創建該基礎行。


加分點:我已經注意到,我不能去另一個層次了,但如果你想糾正我的,我會感激你永遠(即 Employee : User。)也。


更新:攝製available here on github.com

UPDATE2:格特阿諾德的有關無法映射泛型類,從而打破鏈理論不幸產生相同的遷移,其中User沒有通過降至Entity

Update3:我可以確認,當用戶地圖正確時,上面的「紅利」確實有效。 Entity : User : Employee的繼承結構在所有3個表都適用時,當用戶甚至不能映射回實體時,它顯然不工作,我相信現在它是EF中的一個錯誤。

+0

的問題是,EF無法映射像'用戶泛型類'。 –

+0

@GertArnold我不想這樣做,這就是爲什麼我有'用戶'。 –

+0

是的,但'用戶'位於'Entity'和'User'之間,因此對於EF,如果要將其映射爲TPT,則會中斷繼承鏈。 –

回答

2

您需要添加一個DbSet爲您想要的EntityFramework添加一個表,這樣每種類型:

public virtual DbSet<Entity> Entities { get; set; } 
public virtual DbSet<User> Users { get; set; } 
+0

或者,您也可以撥打modelBuilder.Entity ();在OnModelCreating中讓EF將實體拉入模型中。 –

+0

我不知道這會來自哪裏 - 實體表是由其他人創建並使用的,它對其他人來說工作正常。問題是沒有爲這個特定的表格選擇它。 –

+0

有沒有可能共享完整的代碼清單(或項目),以便我們可以調試? –