我在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中进行热切加载?
答案 0 :(得分:2)
正如我comment所述,切换到急切加载可能不是一个好的举动。现在回到你的问题主题。
关于Fetch
:我不知道有这样的限制。您是否尝试使用FetchMany
?您可以提供确切的错误消息吗?您使用的是旧的NHibernate版本吗?
Future
和FutureValue
不受支持:哼,您使用哪个版本的NHibernate?它在那里:NH-2309,在NHibernate v3中完成。 (当前版本是v4.1.1。需要.Net Framework 4,如果您的应用程序没有针对它,请升级到v3。请注意,Linq提供程序不再是外部依赖,因为v3,它是嵌入的,只有{{1 }}。)
using NHibernate.Linq;
:它不应在NHibernateUtil.Initialize
上使用。这样做只是一个无操作。 IQueryable
检查提供的对象是实体代理还是集合代理,如果是,则初始化它。否则它什么都不做,因为这可能是一个直接加载而没有先被代理的集合或实体。可查询不是代理
(这再次强化了我的信念,你应该阅读更多有关NHibernate如何使用延迟加载的信息,因为这个实用程序方法被记录用于代理,并且代理用于延迟加载。特别检查"Improving Performances - Using batch fetching" ,确实&#34;批处理懒惰负载&#34;。)
因此,如果您真的需要使用Linq,同时使用旧版本的NHibernate(&lt; v3),使用您的域名模型&#34;以及#34;,我担心您的案例不受支持。<登记/> 升级NHibernate,更改域模型或更改查询API。