C# Linq到实体-无限实体循环
目前,我正在为我的一个网站开发一个非常大的数据库模型。我使用LINQtoEntities与数据库对话。现在,每当我从上下文中获取对象时,我都会看到以下问题:C# Linq到实体-无限实体循环,c#,database,linq,linq-to-entities,C#,Database,Linq,Linq To Entities,目前,我正在为我的一个网站开发一个非常大的数据库模型。我使用LINQtoEntities与数据库对话。现在,每当我从上下文中获取对象时,我都会看到以下问题: 实体“BookReader”得到了一份他读过的所有书的列表。但实体“Book”也有一个列表,列出了所有读过这本书的读者。这意味着每当我的datacontext在调试模式下返回bookreader实体时,我在他读过的书籍列表中查看,我也会看到其中的所有读者以及他们读过的书籍。等等 这看起来像是一个无休止的循环,我的整个数据库将被加载到内存
- 实体“BookReader”得到了一份他读过的所有书的列表。但实体“Book”也有一个列表,列出了所有读过这本书的读者。这意味着每当我的datacontext在调试模式下返回bookreader实体时,我在他读过的书籍列表中查看,我也会看到其中的所有读者以及他们读过的书籍。等等
这看起来像是一个无休止的循环,我的整个数据库将被加载到内存中。我是否认为这是一个错误,或者这真的会导致性能问题?我不这么认为。在您或您的代码指示EF加载相关实体之前,EF从不加载相关实体。您提到在调试器中可以看到这一点。这意味着您通过打开父实体相关集合触发了相关实体的延迟加载,该集合为空,直到您第一次尝试访问它,并且在调试器中浏览该实体视为访问。您可以在SQL事件探查器中进行检查。Linq to anything永远不会解析他们的查询,除非他们必须这样做 如果查看调试器中的变量,您将在任何子集合上看到“单击以展开”。只有在单击这些按钮时,数据库查询才会真正运行
将数据库加载到调试器中的唯一方法是坐在那里查找每个集合,并在“监视”窗口中手动展开它们。只要lazyloading有效,就不会有问题。谢谢andrew!这和拉迪斯拉夫说的差不多,对我帮助很大。谢谢你的回答。我以为它会像这样工作,但需要确定。我从未使用过SQL profiler,但我看到它已安装在我的计算机上,我会尝试一下。