回滚后的Session.Transaction更改(NHibernate)

Lar*_*ken 6 nhibernate transactions

我有以下代码(为了讨论而简化).我不明白的是为什么session.Transaction属性在回滚后返回不同的事务.

例如,这意味着该属性Session.Transaction.WasRolledBack几乎没有帮助,除非我存储对第一个事务的引用并检查该事务的属性.

任何人都可以提供一些见解吗?

int transId = session.Transaction.GetHashCode();

using (var tx = session.BeginTransaction())
{
   Assert.AreEqual(transId, tx.GetHashCode());

   tx.Rollback();

   Assert.AreEqual(transId, tx.GetHashCode());
   Assert.AreEqual(transId, session.Transaction.GetHashCode()); // Fails
}
Run Code Online (Sandbox Code Playgroud)

更新:

David Walschots的回答非常有用且精确.另外,我在Nhibernate文档中找到了以下内容:

如果你回滚事务,你应该立即关闭并放弃当前会话,以确保NHibernate的内部状态是一致的."

Dav*_*ots 7

来自NHibernate in Action(Kuaté,Harris,Bauer,King):

提交事务后,NHibernate会话将其替换为新事务.这意味着如果您认为以后需要它,您应该保留对您正在进行的交易的引用.如果您需要调用transaction.WasCommited,这是必要的.session.Transaction.WasCommitted始终返回false.

最有可能同样适用于该Transaction.WasRolledBack物业.