C# 具有抽象基的TPT继承不';t参考相关表中的儿童
我正在MVC-EF中努力实现TPT继承 我有一个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;}
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();
}