拦截NHibernate惰性加载行为,如果没有连接到会话返回null

本文关键字:连接 如果没有 会话 null 返回 NHibernate 加载 拦截 | 更新日期: 2023-09-27 18:07:58

这似乎应该是一个显而易见的事情,但我已经寻找了几个小时的答案,现在没有成功。

我正在使用NHibernate来持久化一个域模型,其中有一个服务层为ASP服务。. NET MVC前端("服务层"目前只是一个标准类库,但将来可能会转换为WCF)。web应用程序请求它想要的数据,并指定它需要的域对象上的集合,服务层接受请求,加载对象和所需的集合(使用延迟加载),并将对象传递回使用AutoMapper将其转换为视图模型友好表示的地方。

我想要能够做的是加载所需的集合,从会话中分离对象并将其传递给前端。但是,当AutoMapper尝试映射对象时,这会导致一个异常,因为它试图访问尚未初始化的集合,并且会话不再可用。我可以让对象保持连接状态,但在这种情况下,AutoMapper转换最终会导致对象上的所有属性都是惰性加载的,如果我们沿着WCF路线前进,这将不是一个选项。

我想做的是改变这种行为,而不是抛出一个异常,集合返回空(或更好的是空),当它没有连接到一个会话。这是实体框架V1中的默认行为(无可否认,它没有自动延迟加载),我以前使用过,但我找不到在NH中做到这一点的方法。

任何想法?我说错了吗?

EDIT-为了更清楚地了解我想要实现的目标,当访问集合属性时,我想要这种行为:

连接到会话:正常惰性加载收集
属性为空(而不是抛出异常)

更新-继比利麦卡弗蒂的这篇文章,我已经设法实现了一个解决方案,使用IUserCollectionType似乎工作到目前为止。而不是像他那样使用提供的PersistentGenericBag,我不得不创建新的类型来改变未连接到会话时的行为。它并不完美,需要一些非常丑陋的映射,但至少我不需要触摸我的域对象或客户端映射来让它工作。

拦截NHibernate惰性加载行为,如果没有连接到会话返回null

在这种情况下,最合适的解决方案可能是在AutoMapper中检查延迟加载字段,如果它们确实是用NHibernateUtil.IsInitialized()加载的。不确定如何/如果可能,让Automapper使用这个检查所有隐式的属性映射。

老问题,但这是我们解决同样问题的方法,希望它能帮助你在正确的道路上,如果有人偶然发现这个问题