考虑到OOP它是不可能的,但考虑到EF和继承方式在数据库级别上工作,我想知道EF是否允许jave同时继承同一对象的子类对象。 我的意思是......让我们认为我有一个名为person的表作为parrent表,并且有两个表从中继承,名为user,另一个名为enployee。 由于继承映射在EF工作中通过跟踪子表和parrent表中的相同主键,因此应该可以拥有person类并且能够将其强制转换为employee或user类。 我认为必须对EF生成的代码进行一些修改。
答案 0 :(得分:1)
如果必须使用多态,那么您需要使用每种类型的表(TPT)或每层次的表(TPH)继承。当表格较少时,将TPH用于具有批量表和TPT的域模型,因为域模型越大,查询就会变得混乱。
TPT表示是关系的一部分。用户是个人,用户是雇员。继续你在问题中所说的话,你可以像这样使用TPT:
public abstract class Person
{
public int PersonId { get; set; } // EF will set this as PK
public string FirstName { get; set; }
public string LastName { get; set; }
}
[Table("User")]
public class User : Person
{
public string SomeUserProperty { get; set; }
}
[Table("Employee")]
public class Employee : Person
{
public string SomeEmployeeProperty { get; set; }
}
然后在你的Context
课程中,你只创建一个基类类型DbSet
:
public class MyDbContext: DbContext
{
public DbSet<Person> Person { get; set; }
}
然后在您要创建User或Employee实例的应用程序的某些部分中:
using (var db = new MyDbContext())
{
var user = db.Person.Create<User>();
user.SomeUserProperty = "I'm a user";
var emp = db.Person.Create<Employee>();
emp.SomeEmployeeProperty = "I'm an employee";
db.Person.Add(user);
db.Person.Add(emp);
db.SaveChanges();
}