实体框架 - 使用.Include进行继承?

时间:2009-09-22 17:32:01

标签: entity-framework

我认为这里有类似的帖子,但不完全一样......

我的EF模型中有两个实体 - 让我们称之为Person和Developer,后者继承自前者。

我在开发人员中也有一个名为Qualifications的协会。这在Person实体上不可见。

如果我正在针对上下文编写查询,我该如何自动.Include()开发人员的资格,例如

来自上下文员工的

。员工 。包括(“资格”) 选择员工

不起作用...... EF抱怨这种关系不存在(我假设它在Employee上不存在 - 但在上下文中没有Developer实体,只有Employee)。

4 个答案:

答案 0 :(得分:11)

我遇到过这个问题并进行了一些实验。以下是我发现使用LINQ 2实体工作的内容。

假设我们在您的示例中有人< - Developer ---- Qualifications。

如果您想选择包含资格的开发者,您可以这样做。

var dev = (from d in context.Persons.OfType<Developer>
                            .Include("Qualifications")
          where d.ID == id
          select d).FirstOfDefault();

现在假设我们在Person和Address之间有另一个关联,我们也可以使用LINQ 2 Entity将地址包含在select中。

var dev = (from d in context.Persons
                            .Include("Address")
                            .OfType<Developer>()
                            .Include("Qualifications")
          where d.ID == id
          select d).FirstOfDefault();

注意我在转换Type之前我已经包含了所需的东西,并且在转换后再次包含了。两个包括现在应该没有任何问题地一起工作。我测试了这些方法,它们都有效。我希望他们能为你工作,因为你的继承设置正确。

GL

答案 1 :(得分:3)

这个怎么样:

var results = from developer in ctx.Employee.OfType<Developer>()
              select new {developer, Qualifications = developer.Qualifications};

这里的事情很有趣:

  1. 我们将员工排除在外 不是开发者
  2. 我们正在预测他们的资格,并且 作为该预测的副作用, 一个叫做fixup的东西,每个都有填充 developer.Qualifications也是。即 这是另一种实现方式 与Include()相同的效果。
  3. 如果你随后这样做:

    var developers = from anon in developers.AsEnumerable()
                     select anon.Developer;
    

    你只会得到开发者,他们也会加载他们的资格。

    有关其工作原理的详细信息,请参阅Tip 1

    希望这有帮助

    亚历

答案 2 :(得分:3)

基于Tri Q的答案,但对于那些喜欢&#39; .Load()&#39;方法,您可以使用:

context.Persons.OfType<Developer>().Include(t => t.Qualifications).Load();

我在DbContext中使用它。我创建了LoadDb()方法,它加载了我需要的所有数据。所以我可以在许多项目中使用它。

答案 3 :(得分:0)

我不熟悉EF,但这看起来像标准的继承问题。如果要从“父”对象的集合(实际对象可能是或可能不是子类的实例)访问子类的唯一属性,则需要检查对象类型并将其强制转换为子对象在适当的情况下,您可以访问唯一的属性。

如果某些或所有对象都不是开发人员,那么您希望给定的语句返回什么?