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' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました'
派生テーブルに識別子を (誤って) 挿入しようとしているようです。誰かが助けてくれることを願っています。