NotSupportedException:无法按定义映射类型A.混凝土表(TPC)EF6

本文关键字:混凝土 TPC EF6 类型 映射 定义 NotSupportedException | 更新日期: 2023-09-27 17:57:52

我有这样的模型:

public abstract class Entity   
 {    
    public int Id { get; set; }  
  }
public abstract  class Tree : Entity
    {
        public Tree() { Childs = new List<Tree>(); }
        public int? ParentId { get; set; }
        public string Name { get; set; }
        [ForeignKey("ParentId")]
        public ICollection<Tree> Childs { get; set; }
    }
 public  abstract class Cat : Tree
    {
        public string ImageUrl { get; set; }
        public string Description { get; set; }
        public int OrderId { get; set; }
    }
  public class ItemCat : Cat
        {
            ...
            public virtual ICollection<Item> Items { get; set; }
        }

和配置类:

public class CatConfig : EntityTypeConfiguration<Cat>
    {
        public CatConfig()
        {
            //properties
            Property(rs => rs.Name).IsUnicode();
            Property(rs => rs.ImageUrl).IsUnicode();
            Property(rs => rs.Description).IsUnicode();
        }
    }
 public class ItemCatConfig :EntityTypeConfiguration<ItemCat>
    {
        public ItemCatConfig()
        {
            Map(m => { m.ToTable("ItemCats"); m.MapInheritedProperties(); });
        }
    }

和DbContext:

public class Db :  IdentityDbContext<MehaUser>
    {
        public Db():base("Db")
        {
        }
        public DbSet<ItemCat> ItemCats { get; set; }
    }
 protected override void OnModelCreating(DbModelBuilder mb)
        {
            mb.Configurations.Add(new ItemCatConfig());
            base.OnModelCreating(mb);
        }

但是得到:

System.NotSupportedException:类型"ItemCat"无法按定义映射,因为它映射的是从使用实体拆分或其他形式继承的类型继承的属性。要么选择不同的继承映射策略以不映射继承的属性,要么更改层次结构中的所有类型以映射继承的特性并不使用拆分

更新:我也阅读了这个

NotSupportedException:无法按定义映射类型A.混凝土表(TPC)EF6

找到答案。只需删除ItemCatConfig类中的Map即可。

 Map(m => { m.ToTable("ItemCats"); m.MapInheritedProperties(); });

在TPC中,抽象类不在数据库中实现。ItemCat继承自抽象类,不需要显式映射配置。