会话没有给出正确的记录?

时间:2012-09-02 14:19:58

标签: nhibernate orm

我想保留一个会话,但是当我回滚事务时,事务获取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(); 

任何人都知道这里出了什么问题?我没有得到被删除的对象,即回滚。

2 个答案:

答案 0 :(得分:0)

我花了一段时间才弄明白,但解决方案非常简单。

由于Flush内没有transaction1,因此DELETEtransaction2内的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