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

为什么NHibernate在执行查询之前进行级联?,nhibernate,Nhibernate,因此,我使用Nhibernate.LinqAPI来运行查询。查询本身只需要大约50毫秒,但NHibernate返回结果所花费的总时间约为500毫秒 查询如下所示,session.query().Where(i=>i.ForeignKey==someValue)。Take(5.ToList().AsQueryable()。从创建HQLQueryPlan的调试日志中,通过设置参数、打开连接、水合C#对象和完成,该查询在不到50毫秒的时间内执行 然而,在它开始这么做之前,调试日志显示NHibernat

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

查询如下所示,
session.query().Where(i=>i.ForeignKey==someValue)。Take(5.ToList().AsQueryable()
。从创建
HQLQueryPlan
的调试日志中,通过设置参数、打开连接、水合C#对象和完成,该查询在不到50毫秒的时间内执行

然而,在它开始这么做之前,调试日志显示NHibernate花费了约400毫秒的时间来级联保存和更新,然后报告了一组找到的
集合:
日志,这些日志似乎是我所请求的对象的
集合
属性。我应该补充的是,正在使用的
I会话
是只读的,并且绝对没有修改或创建任何实体。在花费这400毫秒之后,它会记录它刷新了0个更改


为什么NHibernate在执行
.Query()
的过程中级联了大量的save/update命令,它是在试图确保检索到正确的数据吗?这是我设置的某些配置的结果吗?

只有在事务内部执行的查询以及以下情况下才可能出现这种行为:

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

您可以更改会话的刷新模式,或在
default\u flush\u mode
配置设置中指定默认刷新模式。有关详细信息,请参见

我已为此会话设置了
FlushMode.Never
(以前是
FlushMode.Auto
),这解决了刷新问题。然而,这个会话是只读的(这就是为什么我可以设置这个刷新模式),所以我不确定NHib为什么会这样做……也许是因为这个会话正在参与一个事务?虽然包装事务也是只读的…但它也会每次刷新,因此如果我重复运行查询,则重复刷新“nothing”需要整整400毫秒…
FlushMode.
在最新版本中已过时。您应该使用
FlushMode.Manual
。是的,看来NHibernate应该跳过只读会话的自动刷新逻辑,但它不。。。