NHibernate2.1中Flush的调用模式

有很多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语句会按照下面的顺序安排:

  1. 所有对实体进行插入的语句,其顺序按照对象执行ISession.Save()的时间顺序

  2. 所有对实体进行更新的语句

  3. 所有进行集合删除的语句

  4. 所有对集合元素进行删除,更新或者插入的语句

  5. 所有进行集合插入的语句

  6. 所有对实体进行删除的语句,其顺序按照对象执行ISession.Delete()的时间顺序

(有一个例外时,如果对象使用native方式进行 ID 生成的话,它们一执行save就会被插入。)

除非你明确地发出了Flush()指令,关于 ISession合时会执行这些ADO.NET调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,NHibernate保证, ISession.Find(..)绝对不会返回已经失效的数据,也不会返回错误数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值