1

我有一个模型,其中大多数实体都继承了相同的基本功能。该功能被封装在一个抽象基类中。除此之外,还有两个功能分支,因此有两个抽象类继承自抽象基类。此时,具体类继承自它们各自的中间抽象类。

下面是此类模型模型的一个分支的类和 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 IntermediateConcrete1Concrete2确实生成了一个数据库——甚至给了我一个鉴别器列——它并没有像 TPH 映射所要求的那样使列可以为空,因此我最终得到以下异常消息:

(28,10):错误 3023:从第 28 行开始映射片段时出现问题:必须映射表 Concretes 中的列 Concretes.Concrete1Integer:它没有默认值且不可为空。

我已经尝试了几种排列方式-

  • 仅映射Intermediate到自定义表格,但具体类型的字段映射到“基础”表格。
  • 映射Intermediate到自己的表和Concrete1&Concrete2到名为“Concretes”的表 - 与上面代码示例中的原始映射完全相同的问题。
  • 将每个实体映射到它自己的表 - 这行得通,但它纯粹是 TPT,这不是我想要的。
  • 什么都不映射——这会将所有内容都放在“Bases”表中,并且纯粹是 TPH,这实际上会导致表的宽度和稀疏度令人无法接受。

是否没有某种方法可以获取我在代码示例中寻找的映射?也就是使用鉴别器的“Bases”表和“Concretes”表?

4

1 回答 1

2

从 Entity Framework 6.1.0 版本开始,这是一个突出的错误。听起来这也是 6.1.1 中的一个错误,但已计划在 6.1.2 中进行修复。

于 2014-05-13T13:26:36.880 回答