2012-03-27 178 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