NHibernate FlushMode问题从不

时间:2013-09-12 10:20:58

标签: nhibernate orm

我们正在使用NHibernate构建一个大型应用程序作为ORM层。我们尝试应用尽可能多的最佳做法,其中包括FlushModeNever。但是,这给我们带来了痛苦,例如以下情况:

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

  • 删除记录;
  • 删除后,我们对最后一条记录(截止日期)进行(存储库)查询;
  • 此最后一条记录已更新,因为它是新的有效记录。

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

如何使用此方案?有没有办法在不恢复FlushMode设置的情况下解决这个问题,或者我是否应该全部放弃FlushMode设置?

3 个答案:

答案 0 :(得分:1)

  

如何使用此方案?有没有办法解决这个问题   不恢复FlushMode设置

当您想要处理最新数据时,

FlushMode.Never不会阻止您手动调用Flush()。我想这是在不更改FlushMode

的情况下处理此方案的方法
  

或者我应该全部放弃FlushMode设置?

您是否可以提供一些关于FlushMode.Never在一般情况下是一种良好做法的参考?看起来像FlushMode.Never在处理大型,大多数只读对象时很合适。

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

答案 1 :(得分:1)

仅当您绝对需要细粒度控制时,

FlushMode.Never才是最佳做法。 FlushMode.Auto将覆盖99.99%的案例而不会出现问题。也就是说,用ISession.FLush()装饰CUD操作不会有害,因为如果内部操作队列中有任何CUD操作,它只涉及数据库往返

答案 2 :(得分:0)

刷新模式Never表示NHibernate永远不会刷新会话,这取决于你做到这一点。因此,session.Delete()实际上不会从数据库中删除记录,只需在会话缓存中标记要删除的对象。您可以在致电session.Flush()后致电session.Delete()强制进行同花。

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