继承EF代码优先

Pie*_* SS 9 .net c# entity-framework fluent-interface code-first

我有一个基础对象,我不希望在DB中作为一个实体映射,我只希望将属性添加到DB中映射的对象:

没有映射的对象(不知道它是否重要但是baseobject在另一个程序集中):

public class BaseObject
{
    public virtual string Prop1 { get; set; }
    public virtual string Prop2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

映射对象:

public class ChildObject : BaseObject
{
    public virtual string Prop3 { get; set; }
    public virtual string Prop4 { get; set; }
    public virtual string Prop5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

什么在DbContext中注册

  public DbSet<ChildObject> ChildObjects { get; set; }
Run Code Online (Sandbox Code Playgroud)

我想在Db看到什么

table:ChildObject 
    col:Prop1 (from BaseObject)
    col:Prop2 (from BaseObject)
    col:Prop3 
    col:Prop4 
    col:Prop5
Run Code Online (Sandbox Code Playgroud)

要恢复,我想要做的是在Db中有一个具有子项和基本属性的表.

这是我目前得到的错误:

未映射类型"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; }
}
Run Code Online (Sandbox Code Playgroud)

Kyl*_*man 10

Morteza 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-和选择策略,guidelines.aspx

基本上,你需要重写OnModelCreating你的DbContext,并呼吁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");
    });            
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您写一个带有链接的答案[我实际上可以投票.](http://meta.stackexchange.com/questions/94022) (2认同)