1

我们正在构建一个使用 NHibernate 作为 ORM 层的大型应用程序。我们已尝试应用尽可能多的最佳实践,其中设置FlushModeNever. 但是,这给我们带来了痛苦,例如以下场景:

有一个带有结束日期列的表。从此表中,我们删除最后一条(按结束日期)记录:

  • 记录被删除;
  • 删除后,我们对最后一条记录(按结束日期)进行(存储库)查询;
  • 最后一条记录已更新,因为它是新的活动记录。

这是一个非常简单的场景,其中有很多。这里的问题是,当我们进行查询时,我们将删除的记录取回,这当然是不正确的。这大致意味着我们不能在业务逻辑中进行可能触及被插入或删除的实体的查询,因为它的相应。还没有或仍然存在。

我该如何处理这种情况?有没有办法在不恢复FlushMode设置的情况下解决这个问题,还是我应该一起放弃FlushMode设置?

4

3 回答 3

1

FlushMode.Never仅当您绝对需要细粒度控制时才是最佳实践。FlushMode.Auto将涵盖 99.99% 的情况而没有问题。也就是说,用 a 装饰你的 CUD 操作ISession.FLush()不会受到伤害,因为如果内部操作队列中有任何 CUD 操作,它只涉及数据库往返

于 2013-09-13T11:10:36.257 回答
1

我该如何处理这种情况?有没有办法在不恢复 FlushMode 设置的情况下解决这个问题

FlushMode.Never不妨碍您Flush()在要处理最新数据时手动调用。我想这是在不改变FlushMode

还是我应该一起放弃 FlushMode 设置?

您能否就FlushMode.Never一般情况下的良好做法提供一些参考?似乎 FlushMode.Never 适合处理大型的、主要是只读的对象集。

http://jroller.com/tfenne/entry/hibernate_understand_flushmode_never

于 2013-09-12T11:46:44.800 回答
0

刷新模式Never意味着 NHibernate 永远不会刷新会话,这取决于你。因此,session.Delete()实际上不会从数据库中删除记录,只是在会话缓存中标记要删除的对象。session.Flush()您可以通过在调用后调用来强制刷新session.Delete()

我认为Auto是一个更好的选择,AutoNHibernate 会在查询数据之前自动刷新会话。

于 2013-09-13T10:11:50.033 回答