1

TPHのEFコードファーストで問題が発生しています。モデルにないテーブルに2つの追加の列があります。

私は次のようなクラス構造を持っています:

 public class TestBase
    {
        public int Id { get; set; }


        public string Name { get; set; }
        [ForeignKey("TestMaster")]
        public string TestMaster_Id { get; set; }

        public TestMaster TestMaster { get; set; }

    }

    public class TestInherit1 : TestBase
    {
        public string Val1 { get; set; }
    }

    public class TestInherit2 : TestBase
    {
        public string  val2 { get; set; }
    }

    public class TestMaster
    {
        [Key]
        public string Id { get; set; }

        public virtual ICollection<TestInherit1> Inherit1List { get; set; }
        public virtual ICollection<TestInherit2> Inherit2List { get; set; }
    }

DBContextには、次のものがあります。

    public DbSet<TestMaster> TestMaster
    {
        get;
        set;
    }

    public DbSet<TestBase> TestBase
    {
        get;
        set;
    }

    [NotMapped]
    public DbSet<TestInherit1> TestInherit1
    {
        get;
        set;
    }

    [NotMapped]
    public DbSet<TestInherit2> TestInherit2
    {
        get;
        set;
    }

EFで生成されたテーブルの構造は次のとおりです。

[TestBases]

    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NULL,
    [TestMaster_Id] [nvarchar](128) NULL,
    [Val1] [nvarchar](max) NULL,
    [val2] [nvarchar](max) NULL,
    [Discriminator] [nvarchar](128) NOT NULL,
    [TestMaster_Id1] [nvarchar](128) NULL,
    [TestMaster_Id2] [nvarchar](128) NULL

[TestMasters](
    [Id] [nvarchar](128) NOT NULL

TestBasesテーブルを見ると、クラスで定義されていない2つの追加の列TestMaster_id1とTestMaster_Id2が生成されています。EFはこれらの2つの列を挿入しています。TestMaster_Id列に外部キーがすでに定義されています。私は何が間違っているのですか?これらの2つの列は必要ありません。

4

1 に答える 1

1

テーブルには未定義の列がさらに含まれています:Val1Val2およびDiscriminator派生型をマップしたくない場合は、マップしないでください。ただし、これらのタイプをマップしないと、EFからこれらのインスタンスを取得することはなく、そのインスタンスをEFに格納することもできません。

NotMapped属性が正しく使用されていません。エンティティタイプまたはエンティティタイプ内のプロパティのいずれかで宣言する必要があります。また、派生型をマップしたくない場合はDbSet、それらのプロパティを作成しないでください。

属性の正しい使用法は次のいずれかです。

[NotMapped]
public class TestInherit1 : TestBase
{
    public string Val1 { get; set; }
}

または:

[NotMapped]
public virtual ICollection<TestInherit1> Inherit1List { get; set; }

現時点では、エンティティがマップされており、これが2つの新しい外部キーを取得する理由でもあります。ナビゲーションプロパティを派生型に定義しました。EFは派生クラスの親プロパティのマッピングを再定義できないため、それぞれに独自の外部キーが必要です。

親エンティティで単一の外部キーのみを宣言する場合は、親に対して単一のナビゲーションプロパティのみを定義する必要があります。

public virtual ICollection<TestBase> TestList { get; set; }
于 2012-07-02T12:56:43.320 に答える