我有一套在事务内部运行的集成测试。 有时似乎NHibernate事务没有被正确回滚。我无法解决导致这种情况的原因。
以下是这些集成测试夹具运行的基类的略微简化概述:
public class IntegrationTestFixture
{
private TransactionScope _transactionScope;
private ConnectionScope _connectionScope;
[TestFixtureSetUp]
public virtual void TestFixtureSetUp()
{
var session = NHibernateSessionManager.SessionFactory.OpenSession();
CallSessionContext.Bind(session);
_connectionScope = new ConnectionScope();
_transactionScope = new TransactionScope();
}
[TestFixtureTearDown]
public virtual void TestFixtureTearDown()
{
_transactionScope.Dispose();
_connectionScope.Dispose();
var session = CurrentSessionContext.Unbind(SessionFactory);
session.Close();
session.Dispose();
}
}
永远不会调用TransactionScope的提交方法,因此数据如何仍然可以在数据库中结束?
更新我从未真正理解NHibernate处理事务的方式,但我发现在事务中调用Session.Flush()有时会导致数据保留在数据库中,即使然后回滚事务。我不知道为什么你不能打电话给Flush,但后来回滚。这是一个遗憾,因为在集成测试期间,您希望能够访问数据库,并且有时这是执行此操作的唯一方法。
答案 0 :(得分:3)
我在使用听起来相似的Identity生成器时遇到了问题。简而言之,当使用标识生成器保存对象时,它必须写入数据库以获取标识值,并且可以在事务外执行此操作。
Ayende对此有一个blog post。