【问题标题】:EF - Eager include grandchildren not working, does not contain definition for 'Select'EF - 渴望包括孙子不工作,不包含“选择”的定义
【发布时间】:2020-07-16 20:39:07
【问题描述】:

我正在 VS 2015 解决方案中使用 MVC 5 项目和使用 EF 6.1 的代码库项目。我已经从 VS 2013 的先前版本重做整个项目,希望它能解决这个问题,但没有运气。我只是想急切地让一个有孙子的孩子。我试过这个:

            Test t = db.Tests
                .Include("TestsRemoteOBD")
                .Include("TestsRemoteOBD.TestsRemoteOBDDtcs")
                .FirstOrDefault();

还有这个:

            Test t = db.Tests
                .Include(i=>i.TestsRemoteOBD)
                .Include(i=>i.TestsRemoteOBD.Select(s=>s.TestsRemoteOBDDtcs))
                .FirstOrDefault();

包括使用字符串适用于孩子,但不适用于孙辈。在第二个查询中,我收到了这个错误:

TestsRemoteOBD”不包含“Select”的定义,并且找不到接受“TestsRemoteOBD”类型的第一个参数的扩展方法“选择”(您是否缺少 using 指令或程序集参考?)

我已经看到通过添加“using System.Data.Entity;”解决了同样的问题,但我很久以前就这样做了。没有帮助。我还能错过什么?

谢谢!

【问题讨论】:

  • 第一个 sn-p 给你什么错误?
  • TestsRemoteOBD 是收藏吗?
  • 从错误消息看来,TestRemoteOBD 是单个实体引用,因此只需删除 Select
  • 我会避免第一种依赖魔术字符串的方法。试试投影,看看你得到了什么: var test = db.Tests.Select(t => new { parent = t, child = t.TestsRemoteOBD, grandchild = t.TestsRemoteOBD.TestsRemoteOBDDtcs }).FirstOrDefault();
  • 第一个 sn-p 没有给出错误,并且在处理 datacontext 后可以访问 TestsRemoteOBD 记录,但尝试访问孙表 TestsRemoteOBDDtcs,对我说“EntityFramework 中发生了‘System.ObjectDisposedException’类型的异常.dll 但未在用户代码中处理”。我确定我用错了,会尝试这些建议,但为什么是 VS gi

标签: entity-framework entity-framework-6 c#-3.0


【解决方案1】:

非常感谢所有评论的人。至少,我会再打我的头一天。如果父 [Tests] 与 [TestRemoteOBD] 具有一对多的关系,我编写第二个语句的方式会很好,但由于后者不是集合,因此没有定义“选择”。我没有测试过,但我相信它应该是这样的:

Test t = db.Tests
            .Include(i=>i.TestsRemoteOBD)
            .Include(i=>i.TestsRemoteOBD.TestsRemoteOBDDtcs)
            .FirstOrDefault();

【讨论】:

  • 我仍然不能急切地加载 TestsRemoteOBDDtcs,如果我在处理 datacontext 后查看它,仍然会收到异常。我发现如果我只是在数据上下文打开时检查 t.TestsRemoteOBDDtcs.Count() ,那么我可以在关闭后很好地阅读它。这是我的短期解决方案,我将继续前进并尽量不去想它,但会继续检查是否有人有想法。再次感谢大家!很高兴了解为什么我看到“选择未定义”。
【解决方案2】:

撞。发现了这个,并认为我会投入自己的研究。

微软的 Documentation 状态:要包含一个参考,然后是一个参考向下一级:query.Include(e => e.Level1Reference.Level2Reference) - 但这似乎在最简单的用例下也不起作用。使用 .ToList() 执行查询实际上并不包含任何内容。对我来说闻起来像是一个明显的错误!

我可以看到 2 个解决方法。 首先,正如 Ben 建议的那样,您可以手动迭代实体以强制 EF 加载它们。 其次,如果范围允许,您可以忘记“使用”块并将 dbcontext 的更永久实例保留为类成员,以便在访问成员时它仍然可用,而不是处置 (System.ObjectDisposedException)。

【讨论】:

  • 感谢您的跟进。我从来没有修过它。
  • 前几天我在 EF Core 中工作时遇到了这个问题,在另一个项目中,在较新的框架中,您可以像这样解决原始问题... Test t = db.Tests 。 Include(i=>i.TestsRemoteOBD) .ThenInclude(t=>t.TestsRemoteOBDDtcs) .FirstOrDefault();
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多