Дискриминатор TPH не относится к базовому классу / таблице

У меня проблема с дискриминаторами в наследовании TPH с Entity Framework v6.1.1

Я ожидаю, что дискриминатор должен упасть на таблицу, которая является представителем базового класса. Однако, похоже, 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

Однако, когда я пытаюсь добавить новый Staff, я сталкиваюсь со следующим исключением:

'System.Data.SqlClient.SqlException: Невозможно вставить значение NULL в столбец'PersonTypeId', таблица'MyDb.dbo.Person'; столбец не допускает нулевые значения. Вставить не удается. Заявление было прекращено'

Похоже, что он пытается вставить дискриминатор (неправильно) в производную таблицу. Надеюсь, кто-то может помочь.

1 ответ

Решение

Похоже, я неправильно понял настройку TPH для Entity Framework.

В моем случае я хочу отобразить производные типы в отдельные таблицы, что является примером таблицы для каждого типа - http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

Дискриминаторы избыточны в этом контексте.

Другие вопросы по тегам