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 快照。左边的文件是我失败的原始代码,右边是我DbSet<Pet>在 DbContext 中包含 a 时生成的文件。
edmx 差异的 KDiff

4

1 回答 1

2

您需要将 Pets 添加到您的上下文中:

// 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 回答