NHibernate 何时使用延迟加载
本文关键字:延迟加载 何时使 NHibernate | 更新日期: 2023-09-27 18:32:22
我对延迟加载的理解是,它只在需要对象时才加载,我们应该使用它。请解释一下我们必须使用和不使用它的场景?提前谢谢。
我会这样说:
延迟加载是ORM的本质。这是ORM的原则。 (除非我们想一次性加载完整的数据库)
查看Ayende的这篇文章:
冬眠是懒惰的,只是忍受它
来自该来源的小引用:
。默认情况下将 lazy 设置为 true 是有充分理由的,虽然我确信有一些有限数量的场景 lazy="false" 是合适的选择,但它不适合您的场景......
根据我的经验:
我很难比Ayende的那篇帖子更好地解释它。但我必须确认 - 我以同样的方式看待它。我从未使用过非懒惰设置。如果应该一次加载某些内容 - 使用投影:
- 让ORM的东西变得懒惰
- 根据需要调整即席查询
简短地回答您的问题:我建议您使用延迟加载,但您必须在设计应用程序时考虑到延迟加载。
更彻底的答案:延迟加载是 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以及如何安全地使用延迟加载的更多信息。