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

Why is NHibernate cascading before executing a query?

所以我正在使用 Nhibernate.Linq API 到 运行 的查询。查询本身只需要大约 50 毫秒,但是 NHibernate 花费的总时间 return 结果是大约 500 毫秒。

查询如下,session.Query<T>().Where(i => i.ForeignKey == someValue).Take(5).ToList().AsQueryable()。从创建 HQLQueryPlan 的调试日志开始,通过设置参数、打开连接、混合 C# 对象和完成,此查询在不到 ~50 毫秒内执行。

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

为什么 NHibernate 在执行 .Query<T>() 期间级联加载 save/update 命令,它是否试图确保检索到正确的数据?这是我设置的某些配置的结果吗?

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

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

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