inheritanceEF代码优先
我有一个基础对象,我不想在数据库中作为一个实体映射,我只希望将属性添加到在数据库中映射的对象:
没有映射的对象(不知道它是否重要但是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 ChildObjects { get; set; }
我想在Db看到什么
table:ChildObject col:Prop1 (from BaseObject) col:Prop2 (from BaseObject) col:Prop3 col:Prop4 col:Prop5
要恢复,我想要做的是在Db中有一个具有子项和基本属性的表。
这是我目前得到的错误:
未映射类型“namespace.ChildObject”。 使用Ignore方法或NotMappedAttribute数据批注检查未明确排除类型。 validation类型是否已定义为类,不是原始类,嵌套类还是通用类,并且不从EntityObjectinheritance。
我一直在挖,但找不到怎么做。
有任何想法吗?
编辑:
@Kyle Trauberman是正确的,但由于某种原因,从不同程序集中的基类inheritance似乎存在问题。 我只是这样做了。
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; } }
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
中重写OnModelCreating
并为每个子表调用MapInheritedProperties()
。
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().Map(m => { m.MapInheritedProperties(); m.ToTable("BankAccounts"); }); modelBuilder.Entity().Map(m => { m.MapInheritedProperties(); m.ToTable("CreditCards"); }); }