2009-02-03 45 views
3

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

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

我真的不希望我的包裹清理代码

try { 
... 
} 
catch (ObjectDisposedException) { } 

但我真的不知道任何其他方式。 Session.IsOpen和Session.IsActive属性似乎没有提供任何可靠的信息让我确认会话已被处置。

如需完整的源代码,您可以在Assembla上查看。

回答

1

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

0

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

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

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

我还建议留意你的finaliser实现。 “Session.Is().InTransaction()”变为Session-> Transaction,并且在终结者接近它时会话可能为空。无法保证在定稿人时间导航托管关系。

+0

我得到异常的唯一地方是在.Reconnect当会话已被NH处置时,出于某种原因,当它被释放时它仍然可以拥有Session.IsOpen = true。这是我见过的最荒谬的事情之一,即使在处置之后,未清财产仍然是真实的。 – 2009-02-04 14:29:01

+0

我使用NH的SessionFactory来创建会话我不知道如何让它使用自定义会话类,而不是下载源代码并对其进行修改。但是,如果我只是想这样做,我只会在Dispose()在IsOpen返回false的会话上调用它。 – 2009-02-04 14:32:58

+0

“Session已经被NHibernate处置了”?在什么情况下会发生?自从我和NHibernate一起玩的时候已经有一段时间了,但我不记得它曾经处理过一个会话本身。 – Quibblesome 2009-02-04 18:58:14

0

“这是最荒谬的事情,我已经看到有一个它的开放特性,即使废弃后留下真实”

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