1

複数のレベルの継承を持ち、いくつかの中間クラスが抽象である既存のモデルがあります。モデルは正常に見えますが、データベースを作成しようとすると、次のエラーが発生します。

13、20行目から始まるフラグメントのマッピングの問題:異なるキーを持つ2つのエンティティが同じ行にマッピングされます。これらの2つのマッピングフラグメントが、異なるキーを持つ2つのエンティティグループを同じ行グループにマップしないようにしてください。

これが、エラーを再現するために書くことができる最も簡単なコードです。Pet具体的にすれば問題はなくなります。階層内で複数の抽象クラスを許可するにはどうすればよいですか?

public abstract class Animal
        {
            public int Id { get; set; }
        }
public abstract class Pet : Animal
{
    public string Name { get; set; }
}

public class Fish : Pet
{
    public bool IsFreshwater { get; set; }
}

public class Dog : Pet
{
    public bool IsNeutered { get; set; }
}

public class Person : Animal
{
    public Pet MyPet { get; set; }
}

public class PersonContext : DbContext
{
    public DbSet<Person> People { get; set; }
}

[TestFixture]
public class AnimalTests
{
    [Test]
    public void CanCreateDatabase()
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<PersonContext>());
        using (var context = new PersonContext())
        {
            Assert.AreEqual(0, context.People.Count());//fails here
        }
    }
}

アップデート。これは、生成された.edmxファイルの違いのKDiffスナップです。左側のファイルは失敗した元のコードであり、右側のファイルはDbSet<Pet>DbContextにを含めたときに生成されるものです。
edmxの違いのKDiff

4

1 に答える 1

2

コンテキストにペットを追加する必要があります。

// Table-per-class (TPC)
public class PersonContext : DbContext
{
    public PersonContext()
    {
    }

    public DbSet<Person> People { get; set; }
    public DbSet<Pet> Pets { get; set; }
}

編集:階層継承によるテーブルが必要だと言ったコメントを見たところです。したがって、問題は、DbSetが正しく入力されていないことです。つまり、基本タイプを使用して単一のDbSetが必要です。

// Table-per-hierarchy (TPH)
public class PersonContext : DbContext
{
    public PersonContext()
    {
    }

    public DbSet<Animal> Animals { get; set; }
}
于 2013-03-27T17:58:20.837 に答える