首先绘制TPT战略实体框架代码
本文关键字:实体 框架 代码 绘制 TPT | 更新日期: 2023-09-27 18:03:45
我首先在EF Code工作,我喜欢抽象!所以我希望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; }
}
我的map开始是每个类型的表。课程的
ItemCat的所有基类都由abstract关键字修饰。但在迁移我得到TreeBases表在Db,真的为什么?我很好奇,因为它很抽象。我的映射需要显式定义任何配置吗?我使用EF 6
编辑也EF在迁移创建Discriminator列为TreeBase表,当我插入记录它有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(); });
}
但得到:
类型'ItemCat'不能按定义映射,因为它映射从使用实体分割或其他方式的类型继承属性继承的形式。要么选择不同的继承映射策略,以便不映射继承的属性,或更改中的所有类型映射继承属性和不使用拆分的层次结构。
当你不做任何ToTable()
映射时,你已经使用了TPH(表每层次结构),当你做ToTable()
和MapInheritedProperties()
时,TPC(表每具体类型)。如果您想使用TPT(每类型表),则只执行ToTable()
映射并关闭对MapInheritedProperties()
的调用,如下所示:
ToTable("ItemCats");