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' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました'

派生テーブルに識別子を (誤って) 挿入しようとしているようです。誰かが助けてくれることを願っています。

4

1 に答える 1

0

そのため、Entity Framework の 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 に答える