C# 使用NHibernate HQL时是否需要显式刷新

C# 使用NHibernate HQL时是否需要显式刷新,c#,nhibernate,C#,Nhibernate,在NHibernate会话中,我们是否需要在执行HQL语句之前调用Flush() 我相信无论何时处理HQL,NHibernate都应该足够聪明,可以刷新 比如说, using (ISession session) { var query = session.CreateQuery( $"DELETE FROM Table WHERE id = :id") .SetPar

NHibernate
会话中,我们是否需要在执行
HQL
语句之前调用
Flush()

我相信无论何时处理HQL,NHibernate都应该足够聪明,可以刷新

比如说,

        using (ISession session)
        {
            var query = session.CreateQuery(
                    $"DELETE FROM Table WHERE id = :id")
                .SetParameter("id", someId);

            session.Flush(); //is this necessary?
            query.ExecuteUpdate();
            session.Clear(); //is this necessary?
       }

在读取数据时,如果您的
FlushMode
设置为
Auto
,这是默认设置,那么NH将努力管理刷新,以便查询结果与会话中当前的一致

然而,当涉及到添加、更新和删除时,显式是很重要的。以下代码是规范示例:

 using (ISession session)
 using (var transaction = session.BeginTransaction())
 {
     var query = session.CreateQuery(
         $"DELETE FROM Table WHERE id = :id")
            .SetParameter("id", someId);

     query.ExecuteUpdate();

     transaction.Commit();
 }
提交事务会在提供数据库一致性的同时为您处理刷新


我必须警告这个答案,我很少使用HQL,因此我的答案可能缺少与HQL及其行为特别相关的内容。

当涉及到读取数据时,如果您的
FlushMode
设置为
Auto
,这是默认设置,然后NH将努力管理刷新,以便查询结果与会话中当前的结果一致

然而,当涉及到添加、更新和删除时,显式是很重要的。以下代码是规范示例:

 using (ISession session)
 using (var transaction = session.BeginTransaction())
 {
     var query = session.CreateQuery(
         $"DELETE FROM Table WHERE id = :id")
            .SetParameter("id", someId);

     query.ExecuteUpdate();

     transaction.Commit();
 }
提交事务会在提供数据库一致性的同时为您处理刷新

我必须警告这个答案,我很少使用HQL,所以我的答案可能遗漏了一些与HQL及其行为特别相关的东西