C# ef inheritance
本文关键字:inheritance ef | 更新日期: 2023-09-27 18:06:41
考虑到OOP,它不应该是可能的,但考虑到EF和继承的方式在DB级别上工作,我想知道EF是否允许在同一时间从同一对象继承子类对象。我的意思是……让我们假设我有一个名为person的表作为父表,并且有两个表继承它名为user和另一个名为employee的表。由于继承映射在EF中的工作方式是在子表和父表中跟踪相同的主键,因此应该可以使用person类并将其强制转换为雇员类或用户类。我认为必须对EF生成的代码进行一些修改。
如果多态性是必须的,那么您需要使用每类型表(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();
}