TPH Discriminator不在基类/表上

时间:2014-07-01 07:25:47

标签: entity-framework ef-code-first entity-framework-6 tph

我在使用Entity Framework v6.1.1进行TPH继承中的鉴别器时遇到问题

我希望鉴别器应该落在代表 base 类的表上。但是,似乎EF试图将鉴别器列映射到映射到派生类的表

E.g。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Staff : Person
{
    public decimal? Salary { get; set; }
}

public class MyContext : DbContext
{
    public MyContext()
        : base("MyConnectionString") {}

    public virtual IDbSet<Person> Persons { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .Map(x => x.ToTable("Person"))
            .Map<Staff>(x => x.ToTable("Staff").Requires("PersonTypeId").HasValue(1));
    }
}

我也在使用现有的架构 - 即:

CREATE TABLE Person
(
    Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Name VARCHAR(50) NULL,
    PersonTypeId INT NOT NULL
)

CREATE TABLE Staff 
(
    Id INT NOT NULL REFERENCES Person(Id),
    Salary DECIMAL NULL
)
GO

但是,当我尝试添加新员工时,遇到以下异常:

  

'System.Data.SqlClient.SqlException:无法将值NULL插入列'PersonTypeId',表'MyDb.dbo.Person';列不允许空值。 INSERT失败。   该声明已被终止'

它似乎试图将鉴别器(错误地)插入到派生表中。希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

所以我似乎误解了实体框架的TPH设置。

就我而言,我想将派生类型映射到单独的表,这是每个类型的表的示例 - http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

在这种背景下,判别者是多余的。