繁体   English   中英

实体框架6.1代码优先TPH / TPT混合映射问题

[英]Entity Framework 6.1 Code First TPH/TPT hybrid mapping issue

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

以下是这种模型模型的一个分支的类和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行:表Concrete中的列Concrete.Concrete1Integer必须映射:它没有默认值,并且不能为空。

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

  • 仅将Intermediate映射到自定义表,但是将具体类型的字段映射到“基础”表。
  • Intermediate映射到其自己的表,将Concrete1Concrete2映射到名为“ Concretes”的表-与上述代码示例中的原始映射完全相同。
  • 将每个实体映射到它自己的表-可以,但是纯TPT并不是我想要的。
  • 什么都不映射-这会将所有内容都放入“基本”表中,并且纯属TPH,这对于真正的结果来说是一个无法接受的宽且稀疏的表。

在代码示例中,没有某种方法可以获取我正在寻找的映射吗? 也就是说,使用区分符的“基本”表和“具体”表?

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

暂无
暂无

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

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