刷新NHibernate同时仍然允许事务回滚

cbp*_*cbp 5 nhibernate transactions flush

我试图将NHibernate与未与NHibernate映射的遗留实体一起使用.有时这意味着我需要手动将NHibernate数据刷新到数据库,这样当我尝试将遗留实体与NHibernate映射实体连接时,我不会收到外键异常.

当这发生在需要回滚的事务中时会发生问题.从NHibernate刷新的数据不会回滚.

我能做些什么吗?

UPDATE

仍然很好奇如何做到这一点 - 我不相信给出的任何答案都解决了这个问题.我需要调用Flush().问题是,如何回滚已刷新的数据?

tol*_*sm7 2

当使用NHibernate的事务时,尽量避免使用Session.Flush(),而是使用transaction.Commit(),它在内部调用session.flush()。

如果在 Commit() 期间发生错误并且需要回滚事务,可以这样解决。

public static void CommitChanges()
{
    ITransaction transaction = Session.BeginTransaction();

    try
    {
        transaction.Commit();
    }
    catch (HibernateException ex)
    {
        transaction.Rollback();
        //close and dispose session here
        throw ex;
    }
    finally
    {
        transaction.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果对flush() 的手动调用或对commit() 的调用成功完成,则无法使用NHibernate 机制回滚事务。特别是在调用 transaction.Commit() 命令时,NHibernate 创建的 AdoTransaction 在 Commit() 完成后立即被释放,因此您无法访问它以进行回滚。

上面的代码示例允许您捕获提交期间发生的错误,然后回滚已经开始的事务。

现在,您不再在上面的示例中调用 transaction.Commit(),而是在我的测试中调用 session.Flush(),数据库中不会保存任何数据,因为事务从未提交。

我不知道你的代码是什么样的,但如果你以某种模式调用,如上面的代码示例所示,使用 transaction.commit() 而不是 Session.Flush() 它应该为你提供一种实现你的目标的方法想。