继承EF代码优先

时间:2012-03-27 17:57:33

标签: c# .net entity-framework code-first fluent-interface

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

没有映射对象(不知道它是否重要但是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

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

这是我目前得到的错误:

  

未映射类型'namespace.ChildObject'。检查类型   尚未使用忽略方法或明确排除   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; }
}

1 个答案:

答案 0 :(得分: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-and-choosing-strategy-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");
    });            
}