令我彻底混淆的一件事是使用session.Flush
,和session.Commit
,和session.Close
.
有时session.Close
工作,例如,它提交我需要的所有更改.我知道我需要在有事务时使用提交,或者需要在具有多个创建/更新/删除的工作单元中使用提交,以便我可以选择在发生错误时回滚.
但有时我真的被后面的逻辑所困扰session.Flush
.我已经看到了一些示例,其中有一个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
a长时间保持打开和断开状态.
...
另请参阅本节:
结束会议涉及四个不同的阶段:
刷新会话
提交交易
关闭会议
处理异常
刷新会话
如果您碰巧使用
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事务,那么将不会自动刷新会话.