2012-03-27 218 views
9

我有我不想在DB被映射作爲一個實體基礎對象,我只所需的屬性被添加到在所述DB中映射的對象:繼承EF代碼優先

未映射對象(不知道如果它的事項,但baseobject是在另一個組件):

public class BaseObject 
{ 
    public virtual string Prop1 { get; set; } 
    public virtual string Prop2 { get; set; } 
} 

映射對象:

public class ChildObject : BaseObject 
{ 
    public virtual string Prop3 { get; set; } 
    public virtual string Prop4 { get; set; } 
    public virtual string Prop5 { get; set; } 
} 

是什麼的DbContext

註冊
public DbSet<ChildObject> ChildObjects { get; set; } 

我想什麼用dB

table:ChildObject 
    col:Prop1 (from BaseObject) 
    col:Prop2 (from BaseObject) 
    col:Prop3 
    col:Prop4 
    col:Prop5 

看到要恢復,我想要做的,是有一個表中有兒童和基本屬性數據庫。

這是我目前得到的錯誤:

類型「namespace.ChildObject」沒有映射。檢查使用Ignore方法或 NotMappedAttribute數據註釋未明確排除類型 。驗證類型是否定義爲 作爲類,不是原始的,嵌套的或通用的,並且不從EntityObject繼承 。

我一直在四處尋找,但無法找到如何做到這一點。

任何想法?

編輯:

@Kyle Trauberman是正確的,但是,由於某種原因,似乎有與來自不同的裝配基類繼承的問題。我只是做了這個。

class BaseObjectClone : BaseObject { } /* BaseObject being in another assembly */ 

public class ChildObject : BaseObjectClone { 
    public virtual string Prop3 { get; set; } 
    public virtual string Prop4 { get; set; } 
    public virtual string Prop5 { get; set; } 
} 
+2

所以,你不希望基類中定義的屬性映射到數據庫?或者你想要他們映射?你現在看到什麼,和你想看到什麼? – 2012-03-27 18:01:26

+0

抱歉可能不清楚。我的意思是我不希望baseobject被映射爲不同的實體,但我想要顯示在子對象中的屬性。 – 2012-03-27 18:04:13

+0

我能用我的答案[這裏](https://stackoverflow.com/a/45762308/1718832)解決我的類似案例 – vk5880 2017-08-18 18:01:39

回答

10

莫爾塔扎Manavi有一篇博客文章中詳細介紹瞭如何做到這一點:

http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx

基本上,你需要重寫OnModelCreatingDbContext並呼籲MapInheritedProperties()每個子表的。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<BankAccount>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("BankAccounts"); 
    }); 

    modelBuilder.Entity<CreditCard>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("CreditCards"); 
    });    
} 
+0

Morteza有一系列有關繼承的帖子,你應該檢查出來。以下是第1部分:http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-層次-TPH。aspx – 2012-03-27 18:10:31

+0

我已經閱讀了這篇文章,但也許​​我錯過了一些東西,因爲它仍然在'ChildObject'上拋出一個錯誤 – 2012-03-27 18:11:07

+1

瞭解你得到的錯誤會很有幫助。 – 2012-03-27 18:12:01