【问题标题】:NHibernate FlushMode - Why Can't NH Evict Everything Not Saved?NHibernate FlushMode - 为什么 NH 不能驱逐所有未保存的内容?
【发布时间】:2026-01-18 23:15:01
【问题描述】:

我花了一些时间搜索如何配置 NHibernate 的 FlushMode,以便它只能保存我明确称为 Save/Update/Delete 的对象,但我发现我不能这样做。取而代之的是,当我使用 NHibernate 事务管理时,我必须逐出我修改过的每个对象(即使没有调用 Save/Update/Delete)。

我完全理解为什么 NHibernate 必须在一些 Find 操作之前刷新一些对象,但我并不担心过时的数据。我看到,也许在某些情况下,刷新所有已修改且未明确保存的内容可能很有用,但这不是我的情况。

我只是希望在提交会话后,NHibernate 插入/更新/删除我明确要求的所有内容,并驱逐其他所有内容。我的问题是:这种行为只是“没有人停下来实施这个”的问题,还是如果这种行为存在,是否还有其他点会失败?

提前谢谢你。

菲利普

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    Nhibernate 不这么认为。区别在于瞬态对象和持久对象之间,持久对象在刷新会话时与数据库同步(可能在其他时间)。使用 NH 检索的对象是持久的,并且会在刷新会话时保存而无需调用 Save(或 SaveOrUpdate),因为它们已经是持久的。有几种控制 FlushMode 的选项,但没有任何选项可以让它按您想要的方式工作。

    一种潜在的解决方法可能是使用 IStatelessSession 检索对象并通过单独的 ISession 处理操作。

    你想解决什么问题?

    【讨论】:

    • 杰米,谢谢你。我正在尝试比较从 DTO(瞬态)创建的对象与在我的服务层(瞬态)中加载的对象,但这是一个很长的故事。 :) 我们可以用 Evict 生存,我理解你的观点,但我仍然认为 ISession 和 IStatelessSession 之间的平均点会很有用。 :)
    【解决方案2】:

    您基本上是在问:“为什么我的锤子不像螺丝刀那样工作?”

    Session 的整个想法(除其他外)是允许自动脏跟踪,因此您无需担心更改了​​什么;只有添加和非级联删除是手动的。

    正如 Jamie 所说,您可以使用 IStateLessSession 代替 ISession。它不会自动跟踪任何内容,也不支持延迟加载。你必须明确告诉它要插入、更新和删除什么。它更多用于只读和批处理上下文,但它可能正是您要寻找的,

    【讨论】: