本文主要是介绍NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
有很多NHibernate的初学者搞不清Flush()这个方法调用的时机和策略。
事实上,ISession有个叫FlushMode的属性,对其赋值即可控制调用Flush()的时机和策略。
那么具体赋什么值对应什么策略呢?NHibernate提供了一个枚举类型。其代码和注释如下:
using System;
namespace NHibernate
{
// 摘要:
// Represents a flushing strategy.
//
// 备注:
// The flush process synchronizes database state with session state by detecting
// state changes and executing SQL statements
//刷出通过检测状态变化和执行SQL状态来处理数据库状态与session状态之间的同步
[Serializable]
public enum FlushMode
{
// 摘要:
// Special value for unspecified flush mode (like null in Java).
Unspecified = -1,
//
// 摘要:
// The ISession is never flushed unless Flush() is explicitly called by the
// application. This mode is very efficient for read only transactions
//ISession(工作单元)绝不会被刷出除非应用程序明确地调用Flush()。这个模式对只读事务非常高效
Never = 0,
//
// 摘要:
// The ISession is flushed when Transaction.Commit() is called
//当Transaction.Commit()被调用时ISession(工作单元)会被刷出
Commit = 5,
//
// 摘要:
// The ISession is sometimes flushed before query execution in order to ensure
// that queries never return stale state. This is the default flush mode.
//查询执行前ISession(工作单元)会被不定时的刷出以确保查询绝不返回无效状态。这是默认的刷出模式
Auto = 10,
//
// 摘要:
// The NHibernate.ISession is flushed before every query. This is almost always
// unnecessary and inefficient.
//ISession(工作单元)在每个查询执行前被刷出。这个模式通常情况下几乎不需要并且效率非常低
Always = 20,
}
}
从以上代码和注释,我们可以很容易找到我们需要的答案。
中文注释部分为本人所翻译,E文水平有限,有什么不到位之处欢迎批评指正。
在默认的FlushMode下,flush() 会在下面的时间点执行:
-
在某些Find() 或者Enumerable() 调用的时候
-
在NHibernate.ITransaction.Commit() 的时候
-
在ISession.Flush() 的时候
涉及的SQL语句会按照下面的顺序安排:
-
所有对实体进行插入的语句,其顺序按照对象执行ISession.Save() 的时间顺序
-
所有对实体进行更新的语句
-
所有进行集合删除的语句
-
所有对集合元素进行删除,更新或者插入的语句
-
所有进行集合插入的语句
-
所有对实体进行删除的语句,其顺序按照对象执行ISession.Delete() 的时间顺序
(有一个例外时,如果对象使用native 方式进行 ID 生成的话,它们一执行save就会被插入。)
除非你明确地发出了Flush() 指令,关于 ISession 合时会执行这些ADO.NET调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,NHibernate保证, ISession.Find(..) 绝对不会返回已经失效的数据,也不会返回错误数据。
本来是想收藏的,但收藏后就再找就不太好找了。就直接转载。
这篇关于NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!