为什么NHibernate在执行查询之前会级联?

时间:2019-09-13 10:05:03

标签: nhibernate

因此,我正在使用Nhibernate.Linq API来运行查询。查询本身仅花费约50毫秒,但NHibernate返回结果所花费的总时间约为500毫秒。

查询如下session.Query<T>().Where(i => i.ForeignKey == someValue).Take(5).ToList().AsQueryable()。从创建HQLQueryPlan的调试日志到设置参数,打开连接,为C#对象水化并完成操作,此查询将在不到50毫秒的时间内执行。

但是,调试日志显示,NHibernate甚至花费了大约400毫秒的级联保存和更新,然后报告了Collection found:日志的捆绑,这些日志似乎是Collection的属性,我要的对象。我应该添加正在使用的ISession是只读的,并且绝对没有修改或创建任何实体。在花费了这400ms之后,它会记录为刷新了0个更改。

为什么NHibernate在执行.Query<T>()的过程中会级联保存/更新命令的负载,它是否试图确保检索到正确的数据?这是我设置的某些配置的结果吗?

1 个答案:

答案 0 :(得分:1)

对于在事务内仅在以下情况下仅执行的查询,这种行为是可能的:

  • 您已将FlushMode设置为FlushMode.Always
  • NHibernate检测到您的查询涉及在当前会话中修改的表。可以通过将FlushMode设置为小于FlushMode.Auto(默认值)(因此为FlushMode.CommitFlushMode.Manual)的值来禁用此行为

您可以更改会话的FlushMode或在default_flush_mode配置设置中指定默认的刷新模式。有关详情,请参见spec

相关问题