【问题标题】:Abstract class with EF Core Migrations带有 EF Core 迁移的抽象类
【发布时间】:2020-07-13 20:19:45
【问题描述】:

我之前在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)
  • Id(两个类都使用)
  • CreatedDtm(两个类都使用)
  • PhoneNo(仅由 A 使用,因此对于 B 始终为 null)
  • EmailAddress(PhoneNo 的对面)

当我自己创建表时它可以工作。但是当我尝试通过 EF Core Migrations 创建它时,我收到以下错误:

实体类型“Base”对应的 CLR 类型不可实例化,并且模型中没有派生实体类型对应于具体的 CLR 类型。

其他帖子 (like this) 表明我正在尝试做的事情是不可能的,我需要使用 Table-per-Type 映射。但我已经看到它起作用了,所以它不可能在所有情况下都有效。是否可以(不扭曲宇宙)使用抽象基类和单个表以及 EF Core 迁移?

【问题讨论】:

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


    【解决方案1】:

    我在Table Per Hierarchy 的一篇文章中偶然发现了一个答案。为了使 EF Core 迁移能够使用抽象类,您必须手动定义鉴别器。所以我需要在 DbContext 文件中的OnModelCreation() 中添加以下内容:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Base>()
            .ToTable("Base")
            .HasDiscriminator<string>("BaseType")
            .HasValue<A>("A")
            .HasValue<B>("B");
    }
    

    当然,你可以随意配置鉴别器,但必须明确配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2021-11-23
      • 2022-11-11
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多