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