我想保留一个会话,但是当我回滚事务时,事务获取isActive = false,因此我不能通过使用相同的事务在下一个语句中提交和回滚。那么我需要创建新的交易,但这里出了什么问题?
var session = NHibernateHelper.OpenSession();/* It returns new session. */
var transaction1 = session.BeginTransaction();
var list1 = session.Query<Make>().ToList(); /* It returs 4 records. */
session.Delete(list1[2]);
/* After Rollback, transaction is isActive=false so I can not commit
* and rollback from this transaction in future. so I need to create new transaction.
*/
transaction1.Rollback();
var transaction2 = session.BeginTransaction();
/* It returns 3 records.
* I am not getting object(which was deleted but after that rollback) here why ?
*/
var list2 = session.Query<Make>().ToList();
任何人都知道这里出了什么问题?我没有得到被删除的对象,即回滚。
答案 0 :(得分:0)
我花了一段时间才弄明白,但解决方案非常简单。
由于Flush
内没有transaction1
,因此DELETE
内transaction2
内的SELECT
内的SQL {{1}}会自动执行。
此行为是预期的。
答案 1 :(得分:0)
Flushing意味着NHibernate将确保所有更改都持久保存到DB。 也就是说,它将确保执行所有必需的SQL语句,使会话与DB保持同步。 ISession将执行将ADO.NET连接的状态与内存中保存的对象状态同步所需的SQL语句。
在您的情况下:当事务处于回滚时,所有这些更改都将被还原,但会话仍未与数据库同步。
所以Session.Flush()会这样做。
http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-endingsession