ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如果没有连接到会话,拦截NHibernate Lazy-Load行为返回null?

2019-07-10 00:04:17  阅读:238  来源: 互联网

标签:c soa nhibernate


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

我正在使用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对所有隐式属性映射使用此检查.

老问题,但这是我们为解决同样的问题所做的,希望如果有人偶然发现这个问题,它会帮助你找到正确的道路.

标签:c,soa,nhibernate
来源: https://codeday.me/bug/20190709/1418460.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有