我对延迟加载的理解是它只在需要对象时才加载,我们应该使用它。 请解释一下我们必须使用哪些场景而不使用它? 提前谢谢。
答案 0 :(得分:3)
我会这样说:
延迟加载是ORM的本质。这是ORM的原则。 (除非我们想一次加载完整的数据库)
查看Ayende的这篇文章:
来自该来源的小小的引用:
...默认情况下,lazy设置为 true 是有充分理由的,而且我确信在 lazy =“false”< lazy =“false”< / strong>是合适的选择,它不适合您的场景...
根据我的经验:
我很难解释它比艾恩德的那篇文章更好。但我必须确认 - 我也是这样看的。我从来没有使用过非懒惰的设置。如果应该一次加载某些东西 - 使用投影:
答案 1 :(得分:1)
很快回答你的问题:我建议你使用延迟加载,但是你必须考虑延迟加载来设计你的应用程序。
更彻底的答案: 延迟加载是NHibernate的默认加载。因此,如果您没有做任何事情来规避它,那么您将使用延迟加载。
使用延迟加载,您可以使用嵌套对象(与其他表有许多关系),它可以正常工作。它们根据需要从数据库加载。
这可能会导致一些问题 - 最着名的是n + 1问题。 Ayende Rahien在此讨论了这个问题:http://ayende.com/blog/3732/solving-the-select-n-1-problem
如果您声明应该急切地提取哪个对象 - 或者使用更智能的查询 - 可以避免这些问题,但您必须牢记这一点。
另一个可能的缺陷是,如果会话已经关闭,则无法延迟加载对象。这在很大程度上取决于您编程的应用程序类型以及您如何使用对象。我们有一个带有许多嵌套对象的富客户端应用程序,这花了我们一些时间来使会话处理正确 - 但最终它工作得很漂亮。
Ayende Rahien解释了NHibernate在这篇文章中使用延迟加载的一些原因:http://ayende.com/blog/4573/nhibernate-is-lazy-just-live-with-it
也许这会为您提供一些指导,让您了解有关NHibernate的更多信息以及如何安全地使用延迟加载。