实体框架6.1代码第一个TPH / TPT混合映射问题

时间:2014-05-02 17:06:11

标签: c# entity-framework table-per-type table-per-hierarchy entity-framework-6.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; }
}

我遇到问题的地方是表格映射。虽然映射IntermediateConcrete1Concrete2确实生成了一个数据库 - 甚至给了我一个鉴别器列 - 但它并没有像TPH映射所需的那样使列可以为空,因此我结束了以及以下异常消息:

  

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

我已尝试了几种这种排列 -

  • 仅将Intermediate映射到自定义表格,但具体类型为&#39;字段映射到&#34; Bases&#34;表
  • Intermediate映射到自己的表格和Concrete1&amp; Concrete2到一个名为&#34; Concretes&#34;的表 - 与上面代码示例中的原始映射完全相同的问题。
  • 将每个实体映射到它自己的表格 - 这是有效的,但它纯粹是TPT,这不是我想要的。
  • 没有映射 - 这会把所有内容都放在&#34; Bases&#34;表并且纯粹是TPH,这对于真实的结果来说是一个令人无法接受的宽而稀疏的表。

有没有办法在代码示例中找到我正在寻找的映射?也就是说,&#34; Bases&#34;桌子和#34;混凝土&#34;使用鉴别器的表?

1 个答案:

答案 0 :(得分:2)

从版本Entity Framework 6.1.0开始,这是一个突出的错误。听起来它也是6.1.1中的一个错误,但是a fix has been scheduled for 6.1.2.