作者:谢諭宥 | 来源:互联网 | 2023-10-16 17:37
这似乎应该是一个显而易见的事情,但我一直在寻找几个小时的答案,但没有成功.我正在使用NHibernate来持久化域模型,服务层服务于ASP.NETMVC前端(“服务层”目前只是一
这似乎应该是一个显而易见的事情,但我一直在寻找几个小时的答案,但没有成功.
我正在使用NHibernate来持久化域模型,服务层服务于ASP.NET MVC前端(“服务层”目前只是一个标准类库,但将来可能会转换为WCF). Web应用程序询问它想要的数据,并在域对象上指定它所需的集合,服务层接受请求,加载对象和所需的集合(使用延迟加载)并使用AutoMapper将对象传递回它的位置一个viewmodel友好的表示.
我想要做的是加载所需的集合,从会话中分离对象并将其传递到前端.但是,当AutoMapper尝试映射对象时会导致异常,因为它正在尝试访问尚未初始化且会话不再可用的集合.我可以保持连接对象,但在这种情况下,AutoMapper转换最终导致对象的所有属性无论如何都是延迟加载的,这不是一个选项,我们沿着WCF路线走.
我想要做的是改变这种行为,以便当它没有连接到会话时,集合返回null(或者更好但是空)而不是抛出异常.这是Entity Framework V1中的默认行为(虽然它确实没有进行自动延迟加载),我之前曾与之合作但我无法找到在NH中进行此操作的方法.
有任何想法吗?我在这里走错了路吗?
编辑 – 为了更清楚我正在尝试实现的目标,访问集合属性时我想要这样的行为:
连接到会话:正常延迟加载集合.
没有session:property为null(而不是抛出异常)
更新 – 在Billy McCafferty的this post之后,我已经设法使用IUserCollectionType实现了一个解决方案,该解决方案到目前为止似乎有效.我没有像他那样使用提供的PersistentGenericBag,而是必须创建在未连接到会话时更改行为的新类型.它并不完美,需要一些非常难看的映射,但至少我不需要触摸我的域对象或客户端映射来使其工作.
解决方法:
在这种情况下,最合适的解决方案可能是在AutoMapper中检查延迟加载字段,如果它们确实加载了NHibernateUtil.IsInitialized().不确定如何/如果可能使Automapper对所有隐式属性映射使用此检查.
老问题,但这是我们为解决同样的问题所做的,希望如果有人偶然发现这个问题,它会帮助你找到正确的道路.