8

わかりました、おそらくこの質問は以前に回答されていますが、私は調査しており、特定の問題の解決策を見つけることができません

このサンプルのコード - Visual Studio 2012 - コンソール アプリ

したがって、複数の継承オブジェクトを持つ EntityFramework Code First モデルがあります。私の問題を表すこの例を作成しました:

モデル

public abstract class Person
{
    [Key]
    public Guid PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public decimal BaseSalary { get; set; }
}

public class ExecutiveEmployee : Employee
{
    public string Title { get; set; }
}

環境

public class MyContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<ExecutiveEmployee> ExecutiveEmployees { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>().Map(x =>
            {
                x.MapInheritedProperties();
                x.ToTable("Employees");
            });

        modelBuilder.Entity<ExecutiveEmployee>().Map(x =>
            {
                x.MapInheritedProperties();
                x.ToTable("ExecutiveEmployees");
            });
    }
}

TPC (Table Per Concrete Type) マッピングを使用したい

移行を実行してデータベースを更新した後の結果は次のとおりです。

ここに画像の説明を入力

これは私の期待でした。ここまでは順調ですね。

しかし、その後.......Gender私は次のようにオブジェクトとプロパティをクラスに追加することにしましたPerson:(これは私の実際のモデルではなく、単なる例です)

public class Gender
{
    [Key]
    public Guid GenderId { get; set; }

    [Required]
    [MaxLength(250)]
    public string Name { get; set; }
}

public abstract class Person
{
    ....
    public Gender Gender { get; set; }
    ....
}

public class MyContext : DbContext
{
    ....
    public DbSet<Gender> Genders { get; set; }
    ....
 }

移行を適用してデータベースを更新した後のデータベース モデルは次のとおりです。

ここに画像の説明を入力

なぜYYYYYYYY?

私は何が欠けていますか?EF が参照プロパティを継承階層にマップするようにしたいだけです。私は、テーブルに正確に外部ExecutiveEmployeesキーが含まれていることを期待していますGendersEmployeesGenders

私は自分でこれを試しましたMyContext.OnModelCreating:

modelBuilder.Entity<ExecutiveEmployee>().Map(x =>
    {
        x.MapInheritedProperties();
        x.Properties(c => c.Gender);// <<-- does not work
        x.ToTable("ExecutiveEmployees");
    });

しかし、移行を追加しようとすると、次のエラーが表示されます。

タイプ 'ExecutiveEmployee' のプロパティ 'Gender' は、モデルから明示的に除外されているか、使用されている DbModelBuilderVersion でサポートされていないタイプであるため、マップできません。

4

1 に答える 1

2

これは奇妙です。サンプルをビジュアル スタジオに実行し、EF Power Tools を使用して、EDMX ジェネレーターがこれらの関係をどのように視覚化しているかを確認しました。これが得られたものです。 エンティティ データ モデル
この図から、エンティティ フレームワークが親クラスでナビゲーション プロパティが既に見つかっていると仮定します。方法については、これは TPC を使用した Code First のマルチレベル継承に関するバグであり、修正する必要があると思います。

于 2013-03-16T00:18:47.310 に答える