我以前在DbSet
中成功使用抽象基类,然后从中继承了多个类。这意味着所有继承的类仅使用它们所需的列映射到同一表。可以在this post中找到更多详细信息(我也问过),但总之,它看起来像这样:
public abstract class Base
{
public int Id { get; set; }
public DateTime CreatedDtm { get; set; }
}
public class A : Base
{
public string PhoneNo { get; set; }
}
public class B : Base
{
public string EmailAddress { get; set; }
}
public DbSet<Base> Bases { get; set; }
用于这两个类的表将具有以下列:
当我自己创建表时它起作用。但是,当我尝试通过EF Core Migrations创建它时,出现以下错误:
实体类型“基础”的对应CLR类型不可实例化,并且模型中没有与特定CLR类型相对应的派生实体类型。
其他帖子(like this)提示我尝试执行的操作是不可能的,并且我需要使用每个类型的表映射。但是我已经看到它起作用了,因此并非在所有情况下都可行。通过EF核心迁移,是否可以(不弯曲整个宇宙)使用抽象基类和单个表?
答案 0 :(得分:1)
在Table Per Hierarchy上的一篇文章中,我偶然发现了一个答案。为了使EF Core Migrations能够使用抽象类,您必须手动定义鉴别符。因此,我需要在DbContext文件的OnModelCreation()
中进行以下操作:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Base>()
.ToTable("Base")
.HasDiscriminator<string>("BaseType")
.HasValue<A>("A")
.HasValue<B>("B");
}
您当然可以根据自己的喜好配置鉴别器,但是必须明确配置。