繁体   English   中英

摘要 class 与 EF 核心迁移

[英]Abstract class with EF Core Migrations

我以前曾在 DbSet 中成功使用抽象基DbSet ,然后从中继承多个类。 这意味着所有继承的类都映射到同一个表,只使用它们需要的列。 可以在这篇文章中找到更多详细信息(我也问过),但简而言之,它看起来有点像这样:

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 添加以跟踪它是什么类型的 class(A 或 B)
  • ID (由两个类使用)
  • CreatedDtm (两个类都使用)
  • PhoneNo (仅由 A 使用,因此始终为 B 使用 null)
  • 电子邮件地址( PhoneNo的对面)

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

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

其他帖子( 如this )表明我正在尝试做的事情是不可能的,并且我需要使用每个类型的表映射。 但是我已经看到它起作用了,所以它不可能在所有情况下都有效。 是否可以(不弯曲宇宙)使用抽象基础 class 和单个表,以及 EF Core Migrations?

我在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");
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM