我首先处理EF代码,我喜欢抽象!所以想拥有像这样的ItemCat实体:
public abstract class EntityBase
{
public int Id { get; set; }
}
public abstract class TreeBase : EntityBase
{
public int? ParentId { get; set; }
public string Name { get; set; }
public virtual TreeBase Parent { get; set; }
public virtual ICollection<TreeBase> Children { get; set; }
}
public abstract class CatBase : TreeBase
{
public string ImageUrl { get; set; }
public string Description { get; set; }
public int OrderId { get; set; }
}
public class ItemCat : CatBase
{
public stringName { get; set; }
// other fields...
public virtual ICollection<Item> Items { get; set; }
}
我的地图startgey是每种类型的表.TPT
ItemCat的所有基类都由abstract关键字解析。但是在迁移中我得到了Db中的TreeBases表,为什么呢?我很奇怪,因为它是抽象的。我的映射是否需要明确定义任何配置?即时通讯使用EF 6
编辑还为迁移中的EF创建TreeBase表的Discriminator列,当我插入Record时,它具有ItemCat值。
修改
protected override void OnModelCreating(DbModelBuilder mb)
{
//Item
mb.Configurations.Add(new TreeBaseConfig());
mb.Configurations.Add(new CatConfig());
}
public class TreeBaseConfig:EntityTypeConfiguration<TreeBase>
{
public TreeBaseConfig()
{
HasMany(rs => rs.Children).WithOptional(rs => rs.Parent).HasForeignKey(rs => rs.ParentId).WillCascadeOnDelete(false);
}
}
public class CatConfig : EntityTypeConfiguration<CatBase>
{
public CatConfig()
{
//properties
Property(rs => rs.Name).IsUnicode();
Property(rs => rs.ImageUrl).IsUnicode();
Property(rs => rs.Description).IsUnicode();
}
}
修改
我添加了ItemCatConfig类:
public ItemCatConfig()
{
//map
Map(m => { m.ToTable("ItemCats"); m.MapInheritedProperties(); });
}
但得到:
类型&#39; ItemCat&#39;因为映射而无法按定义映射 从使用实体拆分或其他类型的类型继承属性 继承的形式。选择不同的继承映射 策略,以便不映射继承的属性,或更改所有类型 用于映射继承属性和不使用拆分的层次结构。
答案 0 :(得分:2)
在执行任何ToTable()
映射时,您已经使用了TPH(每个层次结构表),在执行ToTable()
和MapInheritedProperties()
时,您使用了TPC(每个混凝土类型表) 。如果您想使用TPT(每种类型的表),只需执行ToTable()
映射,并将呼叫保持为MapInheritedProperties()
,如下所示:
ToTable("ItemCats");