2012-05-03 44 views
1

我想创建一个要求,在显示它们之前预先加载所有需要的实体,以最大限度地减少由于疏忽导致的数据库调用的数量。是否有可能强制NHibernate在返回之前测试集合?如何在NHibernate中加载引用/集合,除非它被急切地预加载?

我想到了在返回对象之前检查NHibernateUtil.IsInitialized()之类的东西,不知道如何在全局实现它,而无需为每个属性手动执行。

注意:我不想启用整个应用程序的急切加载,只是引入一个稍微更智能的延迟加载。

回答

0

消费者应该指定应该加载哪些路径,并且DAL应该使用SetFetchMode/Fetch来提前加载路径。所有的数据都被提取。

回答评论:具有加载的数据要么

  • session.Close()扔掉会话
  • session.Clear()后分离所有实例
  • session.Evict(obj)分离OBJ和相关实体

例如

foreach (var item in queryresults) 
{ 
    session.Evict(item); 
} 

所有未初始化的代理和收藏现在会抛出LazyLoadExceptions

+0

我不知道你明白我的意思,让我举一个例子:如果我查询'book'和我预先抓取'pages'那么我就可以通过'book.pages'查看所有页面。但是,如果我查询'book',* not *抓取页面,那么我想'book.pages'抛出一个异常。 – Shagglez