首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate会话ObjectDisposedException

NHibernate会话ObjectDisposedException
EN

Stack Overflow用户
提问于 2009-02-03 21:17:18
回答 3查看 3.2K关注 0票数 3

有没有办法验证一个会话是否已经被NHibernate释放了?

我在Session上有一个包装类,它有自己的终结器和IDispoable实现,但是,如果在我自己在我的类中处理会话之前处理它,我最终会收到一个ObjectDisposedException。

我真的不希望把我的清理代码包装成

代码语言:javascript
复制
try {
...
}
catch (ObjectDisposedException) { }

但我真的不确定有没有其他方法。Session.IsOpen和Session.IsActive属性似乎没有为我提供任何可靠的信息来确认会话已被处理。

完整的源代码可以在Assembla上查看。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-04 21:25:34

好了,我看了一下你的代码。我不知道这是否是问题的症结所在,但是您正在从会话的dispose方法调用End(),该方法反过来会尝试重新连接并释放会话。如果你在此之前已经显式地调用了End(),那么你会得到你想要的结果,避免这种调用。我认为您不应该担心在会话dispose之前回滚事务,因为这是隐式完成的。我只是快速看了一下,但我觉得我真的很喜欢你的实现。

票数 1
EN

Stack Overflow用户

发布于 2009-02-03 22:18:20

我一直认为NHibernate的最佳实践是“每个请求的会话”,这意味着它应该只存在于“使用”作用域中。

代码语言:javascript
复制
using(Session session = new Session())
{
}

我建议尝试阻止两个人处理会话/对话。如果您控制会话的创建,则可以将其封装在执行自己的IsAlreadyDisposed()检查的ISession实现中,以防止出现异常。尽管如此,考虑到这种努力与“预期的异常”和原始代码看起来并不是那么糟糕。

我还建议注意你的finaliser实现。"Session.Is().InTransaction()“进行会话->事务,当终结器到达它时,会话可能是空的。在终结器时导航托管关系不能保证正常工作。

票数 0
EN

Stack Overflow用户

发布于 2009-02-04 20:33:03

“这是我见过的最荒谬的事情之一,即使在处置之后,它的开放属性仍然是正确的。”

为什么已经释放的对象会包含有关其状态的可靠信息?你不应该尝试使用释放的会话,我也不知道nhibernate在哪里处理你的会话,你确定你不是自己处理它吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/508938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档