Entity Framework Core 看不到所有子类型字段
Entity Framework Core does not see all subtype fields
你好,我正在尝试使用包含派生类型重聚的单个具体 table 使用 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;}
}
生成数据库时 Table ATable
不包含 C
subtype.The 的字段 结果 table 只包含 A
-s 字段和 B
-s.
生成table
Id
Name
P.S 我需要使用某种鉴别器吗?我只想要一个 table 具有两个子类型的重聚,并且能够使用 OfType
Linq
扩展访问它。
您所描述的称为 TPH(Table 每个层次结构)继承策略,目前是 EF Core 唯一支持的模式。
但是,与 EF6 不同,EF Core 不会通过反映模型程序集来自动检测派生实体。这在 EF6 中造成了意外的副作用,因此已被删除,现在您需要在模型中显式包含派生类型(如果导航属性或显式 DbSet
等其他机制未包含)。这在 EF Core 文档的 Entity type hierarchy mapping 部分进行了解释:
By convention, EF will not automatically scan for base or derived types; this means that if you want a CLR type in your hierarchy to be mapped, you must explicitly specify that type on your model. For example, specifying only the base type of a hierarchy will not cause EF Core to implicitly include all of its sub-types.
因此,您需要使用示例模型获得 TPH 的最低限度是添加
public DbSet<B> Bs { get; set; }
public DbSet<C> Cs { get; set; }
或Entity
流利API:
modelBuilder.Entity<B>();
modelBuilder.Entity<C>();
你好,我正在尝试使用包含派生类型重聚的单个具体 table 使用 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;}
}
生成数据库时 Table ATable
不包含 C
subtype.The 的字段 结果 table 只包含 A
-s 字段和 B
-s.
生成table
Id
Name
P.S 我需要使用某种鉴别器吗?我只想要一个 table 具有两个子类型的重聚,并且能够使用 OfType
Linq
扩展访问它。
您所描述的称为 TPH(Table 每个层次结构)继承策略,目前是 EF Core 唯一支持的模式。
但是,与 EF6 不同,EF Core 不会通过反映模型程序集来自动检测派生实体。这在 EF6 中造成了意外的副作用,因此已被删除,现在您需要在模型中显式包含派生类型(如果导航属性或显式 DbSet
等其他机制未包含)。这在 EF Core 文档的 Entity type hierarchy mapping 部分进行了解释:
By convention, EF will not automatically scan for base or derived types; this means that if you want a CLR type in your hierarchy to be mapped, you must explicitly specify that type on your model. For example, specifying only the base type of a hierarchy will not cause EF Core to implicitly include all of its sub-types.
因此,您需要使用示例模型获得 TPH 的最低限度是添加
public DbSet<B> Bs { get; set; }
public DbSet<C> Cs { get; set; }
或Entity
流利API:
modelBuilder.Entity<B>();
modelBuilder.Entity<C>();