如何首先使用Entity Framework和代码处理多级抽象?

时间:2013-03-26 18:43:37

标签: entity-framework ef-code-first entity-framework-4.1

我有一个具有多个继承级别的现有模型,其中几个中间类是抽象的。该模型看起来很好,但在尝试创建数据库时,我收到错误:

  

从第13,20行开始映射片段时出现问题:具有不同键的两个实体映射到同一行。确保这两个映射片段不会将具有不同键的两组实体映射到同一组行。

这是我可以编写的最简单的代码来重现错误。如果我使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快照。左边的文件是我失败的原始代码,右边是我在DbContext中包含DbSet<Pet>时生成的内容。
KDiff of edmx differences

1 个答案:

答案 0 :(得分: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; }
}