Entity framework core 实体框架核心未看到所有子类型字段

Entity framework core 实体框架核心未看到所有子类型字段,entity-framework-core,code-first,Entity Framework Core,Code First,您好,我正在尝试使用一个包含派生类型重新组合的具体表,使用EF Core使用派生类 public abstract A { public int Id{get;set;} } public B:A { public string Name{get;set;} } public C:A { public bool IsMan{get;set;} } public class MyContext:DBContext { public DBSet<A> ATa

您好,我正在尝试使用一个包含派生类型重新组合的具体表,使用EF Core使用派生类

public abstract A
{
   public int Id{get;set;}
}
public B:A
{
   public string Name{get;set;}
}
public C:A
{
   public bool IsMan{get;set;}
}

public class MyContext:DBContext
{
     public DBSet<A> ATable {get;set;}
}
公共摘要A
{
公共int Id{get;set;}
}
公共B:A
{
公共字符串名称{get;set;}
}
公共C:A
{
公共布尔伊斯曼{get;set;}
}
公共类MyContext:DBContext
{
公共数据库集ATable{get;set;}
}
生成数据库时,表
ATable
不包含
C
子类型的字段。生成的表仅包含
A
-s字段和
B
-s字段

生成的表

  • Id
  • Name

  • p.S我需要使用某种鉴别器吗?我只希望有一个表具有两个子类型的重新组合,并且能够使用
    of type
    Linq
    扩展访问它。

    您所描述的被称为TPH(每个层次的表)继承策略,目前是EF Core唯一支持的模式

    但是,与EF6不同,EF Core不会通过反映模型部件自动检测衍生实体。这在EF6中造成了意外的副作用,因此已被删除,现在需要在模型中显式包含派生类型(如果导航属性或显式
    DbSet
    s等其他机制未包含派生类型)。这在EF核心文件的第节中进行了解释:

    按照惯例,EF不会自动扫描基本类型或派生类型;这意味着,如果希望映射层次结构中的CLR类型,则必须在模型上显式指定该类型。例如,仅指定层次结构的基类型不会导致EF Core隐式包含其所有子类型

    因此,您需要通过示例模型获得TPH的最低要求是

    public DbSet<B> Bs { get; set; }
    public DbSet<C> Cs { get; set; }
    
    modelBuilder.Entity<B>();
    modelBuilder.Entity<C>();