2012-11-24 92 views
4

多重繼承我試圖映射在TPC風格使用實體框架一些類,並得到了以下錯誤:與實體框架TPC

Error: The type 'A' cannot be mapped as defined because it maps inherited properties from types that use entity splitting or another form of inheritance. Either choose a different inheritance mapping strategy so as to not map inherited properties, or change all types in the hierarchy to map inherited properties and to not use splitting.

當我用下面的類會出現此錯誤:

public abstract class BaseEntityTest 
public abstract class BaseEntityTest2 : BaseEntityTest 
public abstract class BaseEntityTest3 : BaseEntityTest2 
public class A: BaseEntityTest3 // this class is the only one with a table in the db 

在OnModelCreating方法中,我添加了以下代碼以獲得TPC映射

modelBuilder.Entity<A>().Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("A"); 
}); 

當我從結構中排除BaseEntityTest2(因此A只從BaseEntityTest而不是BaseEntityTest2繼承)時,錯誤消失。這是否意味着不可能創建這個映射或者我只是錯過了什麼?

編輯:類

屬性:爲EF 4.3.1及更早版本發生

public abstract class BaseEntityTest 
{ 

    [Key] 
    public Guid Id { get; set; } 

    public String Info { get; set; } 

    [Required] 
    public DateTime CreationDate { get; set; } 

    [Required] 
    public String CreationUser { get; set; } 

    [Required] 
    public DateTime ModificationDate { get; set; } 

    [Required] 
    public String ModificationUser { get; set; } 

    [ConcurrencyCheck] 
    [Required] 
    public int LockVersion { get; internal set; } 
} 

public abstract class BaseEntityTest2 : BaseEntityTest 
{ 
    [Required] 
    public string Name { get; set; } 

    public string Description { get; set; } 

} 

public abstract class BaseEntityTest3: BaseEntityTest2 
{ 

    [Required] 
    public DateTime FromDate { get; set; } 

    public DateTime ThruDate { get; set; } 
} 

public class A: BaseEntityTest3{ 
    public String Test { get; set; } 
} 
+0

這是全貌嗎?在我住的地方工作得很好:)(VS2012,EF 5)。 –

+0

我試過這個使用EF 4.3.1(VS 2012) – Eggi

+0

你有什麼屬性在你的課堂上? –

回答

6

錯誤,但不能用於EF 4.4和EF 5.0。 (EF 4.4實際上是EF 5.0,但與.NET 4.0作爲目標平臺。)

但是:只有當您使用的是抽象類作爲你的模型,這意味着

  • 實體出現的錯誤你要麼有DbSet對於他們在你的上下文類,像

    public DbSet<BaseEntityTestX> BaseEntityTestXs { get; set; } 
    
  • ,或者你有一些流利的映射BaseEntityTestX,一些modelBuilder.Entity<BaseEntityTestX>()...東西

  • ,或者你正在使用的BaseEntityTestX作爲導航性能的一個在另一個(混凝土)實體類型

你需要任何的嗎?

有一個DbSet<BaseEntityTestX>在上下文只會意義,如果你真的想查詢抽象實體之一,如:

List<BaseEntityTest> list = context.BaseEntityTests 
    .Where(b => b.Info == "abc").ToList(); 

結果當然是從BaseEntityTest繼承具體的實體名單,但它可以是不同類型的組合,如A和某些B。你需要這樣的疑問嗎?或者你只是想查詢一些具體的對象:

List<A> list = context.As 
    .Where(b => b.Info == "abc").ToList(); 

在後一種情況下,你不需要爲抽象基類一DbSet,你不需要任何繼承映射。您可以從您的上下文類中刪除DbSet<BaseEntityTestX>,並刪除TPC映射,您的錯誤將消失。

最後一點 - 對另一個實體中的某個抽象實體具有導航屬性 - 對於TPC映射沒有意義。它只是無法映射到關係數據庫,因爲使用TPC映射時,抽象實體沒有表,因此沒有目標可以從具有導航屬性的具體類的表中引用外鍵關係。

modelBuilder.Entity<BaseEntityTestX>().Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("BaseEntityTestX"); 
}); 

但它會爲那些似乎沒有什麼意義對我來說抽象實體表:如果您延長TPC映射到基類

錯誤也將消失。

+0

我想使用抽象類,因爲我需要查詢其中的一個(這樣我就不必爲具體類型編寫多個查詢)。我一接受EF 4.4的測試就會接受你的答案。我不知道有一個針對.NET 4.0的新版本。 – Eggi

+0

EF 4.4似乎解決了這個問題,但是在基類中引入了[NotMapped] - 屬性的問題,所以我不能將它用於我的項目,但答案是正確的。 – Eggi

2
在EF6.0其發梗

EntityTypeConfiguration'<'YourBaseClass'>'

沒有詳細ALL

 this.Map<DerivedClass1>(m => 
     { 
      m.MapInheritedProperties(); 
      m.ToTable(".."); 
     }); 

派生類,如果在assembley只是一個dervied類沒有配置像這樣 你這個例外

+0

這解決了我的問題。上述代碼出現在您的自定義dbContext的OnModelCreating(DbModelBuilder modelbuilder)函數中。在添加初始遷移 - 軟件包管理器控制檯 - >「添加遷移初始化」時,實體框架將在創建數據庫時針對此代碼執行。 –