C#ef继承

时间:2013-03-30 13:05:06

标签: c# entity-framework inheritance entity

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

1 个答案:

答案 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();
}