有没有办法验证一个会话是否已经被NHibernate释放了?
我在Session上有一个包装类,它有自己的终结器和IDispoable实现,但是,如果在我自己在我的类中处理会话之前处理它,我最终会收到一个ObjectDisposedException。
我真的不希望把我的清理代码包装成
try {
...
}
catch (ObjectDisposedException) { }但我真的不确定有没有其他方法。Session.IsOpen和Session.IsActive属性似乎没有为我提供任何可靠的信息来确认会话已被处理。
完整的源代码可以在Assembla上查看。
发布于 2009-02-04 21:25:34
好了,我看了一下你的代码。我不知道这是否是问题的症结所在,但是您正在从会话的dispose方法调用End(),该方法反过来会尝试重新连接并释放会话。如果你在此之前已经显式地调用了End(),那么你会得到你想要的结果,避免这种调用。我认为您不应该担心在会话dispose之前回滚事务,因为这是隐式完成的。我只是快速看了一下,但我觉得我真的很喜欢你的实现。
发布于 2009-02-03 22:18:20
我一直认为NHibernate的最佳实践是“每个请求的会话”,这意味着它应该只存在于“使用”作用域中。
using(Session session = new Session())
{
}我建议尝试阻止两个人处理会话/对话。如果您控制会话的创建,则可以将其封装在执行自己的IsAlreadyDisposed()检查的ISession实现中,以防止出现异常。尽管如此,考虑到这种努力与“预期的异常”和原始代码看起来并不是那么糟糕。
我还建议注意你的finaliser实现。"Session.Is().InTransaction()“进行会话->事务,当终结器到达它时,会话可能是空的。在终结器时导航托管关系不能保证正常工作。
发布于 2009-02-04 20:33:03
“这是我见过的最荒谬的事情之一,即使在处置之后,它的开放属性仍然是正确的。”
为什么已经释放的对象会包含有关其状态的可靠信息?你不应该尝试使用释放的会话,我也不知道nhibernate在哪里处理你的会话,你确定你不是自己处理它吗?
https://stackoverflow.com/questions/508938
复制相似问题