Дискриминатор 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
Дискриминаторы избыточны в этом контексте.