我有一个模型,其中大多数实体都继承了相同的基本功能。该功能被封装在一个抽象基类中。除此之外,还有两个功能分支,因此有两个抽象类继承自抽象基类。此时,具体类继承自它们各自的中间抽象类。
下面是此类模型模型的一个分支的类和 EF 映射示例:
public class TestContext : DbContext
{
public DbSet<Base> Bases { get; set; }
public DbSet<Intermediate> Intermediates { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Intermediate>().ToTable("Concretes");
modelBuilder.Entity<Concrete1>().ToTable("Concretes");
modelBuilder.Entity<Concrete2>().ToTable("Concretes");
}
}
public abstract class Base
{
public int Id { get; set; }
public string BaseString { get; set; }
public int BaseInteger { get; set; }
}
public abstract class Intermediate : Base
{
public string IntermediateString { get; set; }
public int IntermediateInteger { get; set; }
}
public class Concrete1 : Intermediate
{
public string Concrete1String { get; set; }
public int Concrete1Integer { get; set; }
}
public class Concrete2 : Intermediate
{
public string Concrete2String { get; set; }
public int Concrete2Integer { get; set; }
}
我遇到问题的地方是表映射。虽然 mapping Intermediate
、Concrete1
和Concrete2
确实生成了一个数据库——甚至给了我一个鉴别器列——它并没有像 TPH 映射所要求的那样使列可以为空,因此我最终得到以下异常消息:
(28,10):错误 3023:从第 28 行开始映射片段时出现问题:必须映射表 Concretes 中的列 Concretes.Concrete1Integer:它没有默认值且不可为空。
我已经尝试了几种排列方式-
- 仅映射
Intermediate
到自定义表格,但具体类型的字段映射到“基础”表格。 - 映射
Intermediate
到自己的表和Concrete1
&Concrete2
到名为“Concretes”的表 - 与上面代码示例中的原始映射完全相同的问题。 - 将每个实体映射到它自己的表 - 这行得通,但它纯粹是 TPT,这不是我想要的。
- 什么都不映射——这会将所有内容都放在“Bases”表中,并且纯粹是 TPH,这实际上会导致表的宽度和稀疏度令人无法接受。
是否没有某种方法可以获取我在代码示例中寻找的映射?也就是使用鉴别器的“Bases”表和“Concretes”表?