NHibernate何时使用延迟加载?

时间:2014-11-27 06:52:18

标签: c# nhibernate fluent-nhibernate lazy-loading

我对延迟加载的理解是它只在需要对象时才加载,我们应该使用它。 请解释一下我们必须使用哪些场景而不使用它? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

我会这样说:

  

延迟加载是ORM的本质。这是ORM的原则。 (除非我们想一次加载完整的数据库)

查看Ayende的这篇文章:

NHibernate is lazy, just live with it

来自该来源的小小的引用:

  

...默认情况下,lazy设置为 true 是有充分理由的,而且我确信在 lazy =“false”< lazy =“false”< / strong>是合适的选择,它不适合您的场景...

根据我的经验:

我很难解释它比艾恩德的那篇文章更好。但我必须确认 - 我也是这样看的。我从来没有使用过非懒惰的设置。如果应该一次加载某些东西 - 使用投影:

  • 让ORM的东西变得懒惰
  • 根据需要调整 ad hoc 查询

答案 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的更多信息以及如何安全地使用延迟加载。