NHibernate ISession刷新:何时何地使用它,为什么?
让我彻底困惑的一件事是使用session.Flush
,与session.Commit
和session.Close
一起使用。
有时session.Close
可以工作,例如,它会提交我需要的所有更改。 我知道当我有一个事务时需要使用提交,或者有多个创建/更新/删除的工作单元,以便在发生错误时选择回滚。
但有时我真的被session.Flush
背后的逻辑所session.Flush
。 session.Flush
。 我已经看到你有一个session.SaveOrUpdate()
例子session.SaveOrUpdate()
后跟一个刷新,但是当我删除刷新它无论如何工作正常。 有时候我在Flush语句中遇到错误,说会话超时,删除它确保我没有遇到那个错误。
有没有人有一个很好的指导方针,以便在何时何地使用Flush? 我已经检查了NHibernate的文档,但我仍然无法找到一个简单的答案。
简述:
Close()
,而不是包装上的通话ISession
一个内部using
的语句或管理您的ISession其他地方的生命周期 。 从文档:
有时, ISession
将执行将ADO.NET连接的状态与内存中的对象状态同步所需的SQL语句。 这个过程,刷新,默认情况下发生在以下几点
Find()
或Enumerable()
一些调用中, NHibernate.ITransaction.Commit()
ISession.Flush()
SQL语句按以下顺序发布
ISession.Save()
保存相应的对象 ISession.Delete()
删除相应的对象 (使用本地ID生成的对象在保存时会插入一个例外。)
除非你明确Flush()
,否则绝对不能保证Session何时执行ADO.NET调用,只有执行它们的顺序 。 但是,NHibernate确保ISession.Find(..)
方法永远不会返回陈旧的数据; 也不会返回错误的数据。
可以更改默认行为,以便更频繁地进行刷新。 FlushMode
类定义了三种不同的模式:只在提交时刷新(并且仅在使用NHibernate ITransaction
API时),使用已解释的例程自动刷新,或者不会刷新,除非明确调用Flush()
。 最后一种模式对长时间运行的工作单元非常有用,其中ISession
保持打开状态并长时间断开连接。
...
另请参阅本节:
结束会议涉及四个不同的阶段:
冲洗会议
如果您碰巧使用ITransaction
API,则无需担心此步骤。 当事务被提交时,它将被隐含地执行。 否则,您应该调用ISession.Flush()
以确保所有更改都与数据库同步。
提交数据库事务
如果您使用的是NHibernate ITransaction API,则如下所示:
tx.Commit(); // flush the session and commit the transaction
如果您自己管理ADO.NET事务,则应该手动执行Commit()
ADO.NET事务。
sess.Flush();
currentTransaction.Commit();
如果您决定不提交更改:
tx.Rollback(); // rollback the transaction
要么:
currentTransaction.Rollback();
如果你回滚事务,你应该立即关闭并放弃当前会话,以确保NHibernate的内部状态是一致的。
关闭ISession
对ISession.Close()
调用标志着会话结束。 Close()的主要含义是ADO.NET连接将被会话放弃。
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
如果您提供了自己的连接,则Close()
将返回对其的引用,以便您可以手动关闭它或将其返回到池。 否则, Close()
将其返回到池中。
从NHibernate 2.0开始,数据库操作需要事务。 因此, ITransaction.Commit()
调用将处理任何必要的刷新。 如果由于某种原因你没有使用NHibernate事务,那么将不会自动刷新会话。
有时,ISession将执行将ADO.NET连接的状态与内存中的对象状态同步所需的SQL语句。
并始终使用
using (var transaction = session.BeginTransaction())
{
transaction.Commit();
}
在提交更改之后,将此更改保存到数据库中,我们使用transaction.Commit();
链接地址: http://www.djcxy.com/p/23229.html上一篇: NHibernate ISession Flush: Where and when to use it, and why?