c# - 拦截 NHibernate Lazy-Load 行为以在未连接到 session 时返回 null?

标签 c# nhibernate soa

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

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

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

我想做的是改变这个行为,这样当集合没有连接到 session 时,它不会抛出异常,而是返回 null(或者最好是空的)。这是 Entity Framework V1 中的默认行为(诚然它没有执行自动延迟加载),我之前使用过它但我找不到在 NH 中执行此操作的方法。

有什么想法吗?我走错路了吗?

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

已连接到 session :正常延迟加载集合。
无 session :属性为空(而不是抛出异常)

更新 - 关注 this post由 Billy McCafferty 撰写,我已经设法使用 IUserCollectionType 实现了一个解决方案,该解决方案到目前为止似乎有效。不过,我没有像他那样使用提供的 PersistentGenericBag,而是必须创建新的类型,以便在未连接到 session 时更改行为。它并不完美,需要一些非常丑陋的映射,但至少我不需要触及我的域对象或客户端映射来让它工作。

最佳答案

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

老问题,但这是我们为解决同一问题所做的,希望如果有人偶然发现这个问题,它可以帮助您走上正确的道路。

关于c# - 拦截 NHibernate Lazy-Load 行为以在未连接到 session 时返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7322134/

相关文章:

内存中连续对象的 C# 数组?

c# - 无法在 gridview 中访问 TextArea 中的文本

nhibernate - 无法从NHibernate.Driver.SQLiteDriver创建驱动程序

c# - 在面向服务的体系结构中为服务调用定义方法签名的最佳实践是什么?

java - 测试 SOA Java 开发的框架和工具

c# - 按字母顺序从字符串中查找并计算后一对

C# 属性网格字符串编辑器

nhibernate - 是否可以在 NHibernate (>3.0) Linq 的同一查询中调用 IQueryable.To Future() 和 IQueryable.Fetch()?

c# - 错误 : 22001: value too long for type character varying(255)

domain-driven-design - 分布式域驱动设计资源