NHibernate Session ObjectDisposedException

时间:2009-02-03 21:17:18

标签: c# nhibernate objectdisposedexception

无论如何要验证会话是否已被NHibernate处理掉?

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

我真的不希望用

包装我的清理代码
try {
...
}
catch (ObjectDisposedException) { }

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

对于完整来源,您可以在Assembla上查看。

3 个答案:

答案 0 :(得分:1)

好的,只是偷看你的代码。 我不知道这是不是问题,但你是从对话配置方法调用End(), 反过来又试图重新连接和处理会话.. 如果你在此之前已经明确地调用了End(),那么你将得到你得到的,避免那个调用。 我认为您不应该担心在会话处置之前回滚事务,因为这是隐式完成的。 刚看了一眼,但我想我真的很喜欢你的实现。

答案 1 :(得分:0)

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

using(Session session = new Session())
{
}

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

我还建议你注意你的终结者实施。 “Session.Is()。InTransaction()”进入Session->事务,并且当终结者到达它时,会话可能为空。在终结者时间导航托管关系并不能保证有效。

答案 2 :(得分:0)

“这是我见过的最荒谬的事情之一,即使在处置后,其开放资产仍然属实”

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