为什么 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.Commit
或 FlushMode.Manual
)
您可以更改会话的 FlushMode 或在 default_flush_mode
配置设置中指定默认刷新模式。详情见spec
所以我正在使用 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.Commit
或FlushMode.Manual
)
您可以更改会话的 FlushMode 或在 default_flush_mode
配置设置中指定默认刷新模式。详情见spec