C# ef inheritance

本文关键字:inheritance ef | 更新日期: 2023-09-27 18:06:41

考虑到OOP,它不应该是可能的,但考虑到EF和继承的方式在DB级别上工作,我想知道EF是否允许在同一时间从同一对象继承子类对象。我的意思是……让我们假设我有一个名为person的表作为父表,并且有两个表继承它名为user和另一个名为employee的表。由于继承映射在EF中的工作方式是在子表和父表中跟踪相同的主键,因此应该可以使用person类并将其强制转换为雇员类或用户类。我认为必须对EF生成的代码进行一些修改。

C# ef inheritance

如果多态性是必须的,那么您需要使用每类型表(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();
}