EF核心迁移的抽象类

时间:2020-07-13 10:49:15

标签: c# entity-framework entity-framework-core

我以前在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的添加功能,用于跟踪它是哪种类型的类(A或B)
  • 编号(两个类均使用)
  • CreatedDtm (两个类均使用)
  • 电话号码(仅由A使用,因此对于B始终为空)
  • 电子邮件地址(电话号码对面)

当我自己创建表时它起作用。但是,当我尝试通过EF Core Migrations创建它时,出现以下错误:

实体类型“基础”的对应CLR类型不可实例化,并且模型中没有与特定CLR类型相对应的派生实体类型。

其他帖子(like this)提示我尝试执行的操作是不可能的,并且我需要使用每个类型的表映射。但是我已经看到它起作用了,因此并非在所有情况下都可行。通过EF核心迁移,是否可以(不弯曲整个宇宙)使用抽象基类和单个表?

1 个答案:

答案 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");
}

您当然可以根据自己的喜好配置鉴别器,但是必须明确配置。