地图TPT战略实体框架代码拳头

时间:2014-05-15 14:06:18

标签: c# entity-framework orm

我首先处理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;因为映射而无法按定义映射   从使用实体拆分或其他类型的类型继承属性   继承的形式。选择不同的继承映射   策略,以便不映射继承的属性,或更改所有类型   用于映射继承属性和不使用拆分的层次结构。

1 个答案:

答案 0 :(得分:2)

在执行任何ToTable()映射时,您已经使用了TPH(每个层次结构表),在执行ToTable()MapInheritedProperties()时,您使用了TPC(每个混凝土类型表) 。如果您想使用TPT(每种类型的表),只需执行ToTable()映射,并将呼叫保持为MapInheritedProperties(),如下所示:

ToTable("ItemCats");