2011-07-11 178 views
0

目前我正在为我的一个网站开发一个非常大的数据库模型。我正在使用Linq-to-entities与数据库交谈。现在每当我从我的上下文中得到一个对象时,我就会看到这个问题:Linq to Entities - 无尽的实体循环

  • 实体“BookReader”列出了他已阅读的所有书籍。但实体“书”也列出了所有读过这本书的书籍读者。现在,这意味着只要我的datacontext在调试模式下返回一个bookreader实体,并且我查看他已阅读的书目列表,我还会看到那里的所有读者和他们阅读的书籍。等等

它看起来像一个无尽的循环,我的整个数据库将被加载到内存中。我是否认为这是一个错误,或者这是否真的会带来性能问题?

+0

只要lazyloading生效就不会有问题。 – Joakim

回答

2

我不这么认为。 EF不会加载相关实体,除非您或您的代码指示它执行此操作。你提到你在调试器中看到了。这意味着您通过打开父实体触发相关实体的延迟加载 - 直到您尝试首次访问它时,相关的集合才为空,并且在调试器中浏览实体会被视为访问。你可以在SQL分析器中检查它。

+0

感谢您的回答拉迪斯拉夫。我认为它会这样工作,但需要确定。我从来没有与SQL分析器合作过,但我发现它已经安装在我的电脑上,并会试一试。 – Julian

0

Linq-to-anything从来没有解决他们的查询,直到他们必须。

如果您查看调试器中的变量,您将在任何子集合上看到“单击展开”。只有当你点击这些数据库查询才会真正运行。

将数据库加载到调试器的唯一方法是如果您坐在那里找到每个集合并在监视窗口中手动扩展它们。

+0

谢谢安德鲁!这和拉迪斯拉夫说的一样,帮助我很多。 – Julian