EF - Eager包括孙子女不工作,不包含'选择'的定义

时间:2016-12-01 20:48:48

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

长时间访客,第一次发帖,所以原谅我的经验不足。我在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;”解决了同样的问题,但我很久以前就已经这样做了。没有帮助。我还能错过什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

凹凸。发现这一点,并认为我会投入自己的研究。

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

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

答案 1 :(得分:0)

非常感谢所有评论的人。至少我会在另一天敲打我的脑袋。如果父[Tests]与[TestRemoteOBD]有1对多的关系,我编写第二个语句的方式会很好,但由于后者不是一个集合,所以没有' Select&#39 ;定义。我没有测试过,但我相信它应该是这样的:

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