cbp*_*cbp 5 nhibernate transactions flush
我试图将NHibernate与未与NHibernate映射的遗留实体一起使用.有时这意味着我需要手动将NHibernate数据刷新到数据库,这样当我尝试将遗留实体与NHibernate映射实体连接时,我不会收到外键异常.
当这发生在需要回滚的事务中时会发生问题.从NHibernate刷新的数据不会回滚.
我能做些什么吗?
UPDATE
仍然很好奇如何做到这一点 - 我不相信给出的任何答案都解决了这个问题.我需要调用Flush().问题是,如何回滚已刷新的数据?
当使用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() 它应该为你提供一种实现你的目标的方法想。
| 归档时间: |
|
| 查看次数: |
5017 次 |
| 最近记录: |