【问题标题】:Entity Framework Eager Loading Table-Per-Type Inheritance derived classEntity Framework Eager Loading Table-Per-Type Inheritance 派生类
【发布时间】:2013-07-05 13:46:37
【问题描述】:

首先使用每个类型的表继承模型和实体框架代码,我试图急切地加载派生类的列表。请注意,我无法更改模型。

我有以下模型(过于简化)

public class Training
{
    public string Name { get; set; }
    public IList<Person> Persons { get; set; }
}
public abstract class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

[Table("Students")]
public class Student : Person
{
    public string StudentNumber { get; set; }
    public IList<Training> Trainings { get; set; }
}
[Table("Instructors")]
public class Instructor : Person
{
    public DateTime StartingDate { get; set; }
    public IList<Training> Trainings { get; set; }
}

我想按名称查询培训并急切加载包括派生类(学生和教师)在内的所有人员。早在 2011 年 4 月,Tom Dykstra seemed to claim it wasn't possible。

当导航属性位于 TPH 继承结构的派生类上时,实体框架的当前版本不支持一对零或一关系的即时加载。

这有改变吗?我正在使用 EF5。

【问题讨论】:

    标签: entity-framework ef-code-first entity-framework-5 table-per-type


    【解决方案1】:

    我不明白为什么......

    var list = context.Trainings.Include(t => t.Persons)
        .Where(t => t.Name == someName)
        .ToList();
    

    ... 不应该工作。 EF 应该使用具体的Student 和Instructor 实体填充Persons 列表。

    您既没有“一对零或一关系”,也没有“派生类”的导航属性 (Training.Persons)。因此,我认为上述限制不适用于您的模型和查询。

    【讨论】:

    • 我认为,派生类上的导航属性的含义是 IList 培训(我最初忘记在我的问题中添加)在讲师和学生类中,而不是人物类。 Person 和 Instructor/Student 之间的关系不就是一对零或一的关系吗!?
    • 至于包含,我认为您绝对必须包含 Student 和 Instructor 类,以便出于某种原因急切加载数据。有用。谢谢!
    • @Nick-ACNB:是的,它是数据库模式级别的一对零或一关系。但这不是 EF 与参考导航属性的显式关系(它以某种方式“隐藏”在 TPT 映射中)。我认为提到的限制只意味着这种明确的关系。
    • 我想如果我在 Instructor 类中有另一个关系,比如“public InstructorType Type {get;set;}”,我不能急于加载那个?
    • @Nick-ACNB:是的,你不能。但我认为这是 Tom Dykstra 提到的另一个非常特殊的限制(一对一关系和 TPH 继承(你有 TPT))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多