这似乎是一个很常见的问题:我加载了一个 NHibernate 对象,该对象具有一个延迟加载的集合。稍后,我访问该集合以做某事。我仍然打开 nhibernate 会话(因为它是按视图或其他方式管理的),所以它确实有效,但事务已关闭,所以在 NHprof 中我得到“不鼓励使用隐式事务”。
我理解这条消息,并且由于我使用的是工作单元实现,我可以通过创建一个新事务并将对延迟加载集合的调用包装在其中来修复它。
我的问题是这感觉不对……我有一个很棒的 NHibernate 框架,它给了我很好的延迟加载,但是如果不将每个属性访问都包装在事务中,我就无法使用它。
我在谷歌上搜索了很多,阅读了大量的博客文章、关于 SO 的问题等,但似乎找不到完整的解决方案。
这是我考虑过的:
- 关闭延迟加载。我认为这很愚蠢,就像开满了跑车,然后只在生态模式下驾驶它。急切地加载所有内容会损害性能,如果我只有 id 而不是引用,那么为什么还要打扰 Nhibernate?
- 让交易保持更长时间。事务不应该长期存在,只要视图打开就保持打开状态只会自找麻烦。
- 将每个延迟加载属性访问包装在事务中。有效,但臃肿且容易出错。(即,如果我忘记包装访问器,那么它仍然可以正常工作。只有使用 NHProf 会告诉我问题)
- 加载初始对象时,始终加载我可能需要的属性的所有数据。同样,这很容易出错,无论是加载您不需要的数据(因为稍后访问它的调用已在某些时候被删除)或不加载您所做的数据
那么有没有更好的方法呢?任何帮助/想法表示赞赏。