我们正在使用NHibernate构建一个大型应用程序作为ORM层。我们尝试应用尽可能多的最佳做法,其中包括FlushMode
到Never
。但是,这给我们带来了痛苦,例如以下情况:
有一个包含结束日期列的表。从该表中,我们删除最后一个(按结束日期)记录:
这是一个非常简单的场景,其中很多都存在。这里的问题是,当我们进行查询时,我们会收回已删除的记录,这当然是不正确的。这大致意味着我们不能在业务逻辑中进行可能触及正在插入或删除的实体的查询,因为它的响应。还没有,或者还在那里。
如何使用此方案?有没有办法在不恢复FlushMode
设置的情况下解决这个问题,或者我是否应该全部放弃FlushMode
设置?
答案 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会在查询数据之前自动刷新会话。