1

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

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

例如

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' 中;列不允许空值。插入失败。该语句已终止'

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

4

1 回答 1

0

所以看来我误解了实体框架的 TPH 设置。

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

在这种情况下,鉴别器是多余的。

于 2014-07-01T23:34:24.297 回答