C# 具有抽象基的TPT继承不';t参考相关表中的儿童

C# 具有抽象基的TPT继承不';t参考相关表中的儿童,c#,entity-framework,asp.net-mvc-4,table-per-type,C#,Entity Framework,Asp.net Mvc 4,Table Per Type,我正在MVC-EF中努力实现TPT继承 我有一个AAnimal抽象类和两个继承它的类,Zebra和Lion。有一个Cage类,它包含一个AAnimal 我的问题是,因为AAnimal是抽象的,所以当我加载所有框架时,EF无法创建它的实例。所以我想要的是一种方法来覆盖这个行为,让它明白是需要加载一个Zebra还是一个Lion 斑马和狮子有一个主键,也是动物表的外键。这是由EF(TPT继承模型)完成的 公共抽象类AAnimal { [关键] public int AnimalId{set;get;}

我正在MVC-EF中努力实现TPT继承

我有一个
AAnimal
抽象类和两个继承它的类,
Zebra
Lion
。有一个
Cage
类,它包含一个
AAnimal

我的问题是,因为
AAnimal
是抽象的,所以当我加载所有框架时,EF无法创建它的实例。所以我想要的是一种方法来覆盖这个行为,让它明白是需要加载一个
Zebra
还是一个
Lion

斑马和狮子有一个主键,也是动物表的外键。这是由EF(TPT继承模型)完成的

公共抽象类AAnimal
{
[关键]
public int AnimalId{set;get;}
公共字符串名称{set;get;}
}
公共类狮子:阿尼马尔{}
公共类斑马:动物{}
公营雇员
{
[关键]
public int EmployeeId{set;get;}
公共字符串名称{set;get;}
}
公营笼
{
[关键]
public int CageId{set;get;}
[外键(“CagedAnimal”)]
公共int-malid{set;get;}
公共动物{set;get;}
[外籍员工]]
public int CageEmployeeId{set;get;}
公共雇员{set;get;}
}
//模型映射
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().ToTable(“动物”);
modelBuilder.Entity().ToTable(“Lion”);
modelBuilder.Entity().ToTable(“斑马”);
modelBuilder.Entity().ToTable(“Εemployee”);
}
//装上所有的笼子
公共行动结果索引()
{
var allCages=db.Cages.ToList();
}
此时将加载所有CAGE,所有字段都有值,但
CagedAnimal
为空的字段除外。甚至
maild
也有价值

我如何告诉EF在保存数据时遵循相同的过程以加载实体

请注意,这只是一个示例。此外,TPT继承模型也被选为优于其他继承模型的继承模型

public abstract class AAnimal
{
    [Key]
    public int AnimalId { set; get; }
    public string Name { set; get; }
}

public class Lion : AAnimal {}
public class Zebra : AAnimal {}

public class Εmployee
{
    [Key]
    public int EmployeeId { set; get; }
    public string Name { set; get; }
}

public class Cage
{
    [Key]
    public int CageId { set; get; }

    [ForeignKey("CagedAnimal")]
    public int CagedAnimalId { set; get; }
    public AAnimal CagedAnimal { set; get; }

    [ForeignKey("CageEmployee")]
    public int CageEmployeeId { set; get; }
    public Employee CageEmployee { set; get; }
}

// Model mapping
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<AAnimal>().ToTable("Animal");
    modelBuilder.Entity<Lion>().ToTable("Lion");
    modelBuilder.Entity<Zebra>().ToTable("Zebra");
    modelBuilder.Entity<Εmployee>().ToTable("Εmployee");
}

// Load all cages
public ActionResult Index()
{
    var allCages = db.Cages.ToList();
}