我有一个基础对象,我不希望在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; }
}
答案 0 :(得分:10)
Morteza Manavi有一篇博文,详细说明了如何做到这一点:
基本上,您需要覆盖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");
});
}