首先绘制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'不能按定义映射,因为它映射从使用实体分割或其他方式的类型继承属性继承的形式。要么选择不同的继承映射策略,以便不映射继承的属性,或更改中的所有类型映射继承属性和不使用拆分的层次结构。

首先绘制TPT战略实体框架代码

当你不做任何ToTable()映射时,你已经使用了TPH(表每层次结构),当你做ToTable()MapInheritedProperties()时,TPC(表每具体类型)。如果您想使用TPT(每类型表),则只执行ToTable()映射并关闭对MapInheritedProperties()的调用,如下所示:

ToTable("ItemCats");