【发布时间】:2017-09-28 17:51:48
【问题描述】:
我在 NHibernate 中使用 Eager Loading 时遇到了一些问题。在开始维护此应用程序时,我注意到的第一件事是它们似乎并没有在任何地方急切加载。
我的第一个停靠点是 Fetch。但这引发了一个异常,即当集合是 IList 时它无法完成该操作。显然它必须是一个ICollection。我几乎无法更改域,只是为了适应 Fetch。
接下来,我查看了 .Future 和 .FutureValue。不去那里,因为提供商不支持它。
这给我留下了 NHibernateUtil.Initialize。作为概念证明,我写了一些代码,例如:
var leppp = _repository.Query<LogbookEntryProcedure>()
.Where(lep => lep.LogbookEntry.Id == logbookEntryId);
NHibernateUtil.Initialize(leppp.Select(l => l.Complications));
NHibernateUtil.Initialize(leppp.Select(l => l.Magnitude));
NHibernateUtil.Initialize(leppp.Select(l => l.Outcome));
NHibernateUtil.Initialize(leppp.Select(l => l.FollowUps));
var lepp = leppp.Single();
它没有抛出异常。但是,它似乎并没有急于加载任何东西。当我查看 Profiler 时,我可以看到正在对相关对象的数据库进行往返。
那么,在这种情况下,如何在 NHibernate 中进行预加载?
【问题讨论】:
-
“他们似乎并不急于在任何地方加载”:是的,这是 NHibernate 的常见做法。甚至recommended practice by a bunch of people 包括me。正确设置的 NHibernate 应用程序不会遇到 N+1 延迟加载问题。它的代码库更轻,甚至可能在运行时性能上胜过急切加载。通过访问之前的链接了解更多信息。
标签: nhibernate