我有一个具有多个继承级别的现有模型,其中几个中间类是抽象的。该模型看起来很好,但在尝试创建数据库时,我收到错误:
从第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>
时生成的内容。
答案 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; }
}