从NHibernate中的第一级缓存中删除已删除的项目?或者:如何检查缓存的项目是否已被删除?

时间:2012-07-24 08:04:49

标签: nhibernate concurrency multi-user first-level-cache

我们有一个棕色地带多用户应用程序(99%Delphi,1%.net),它使用NHibernate来保持.net模块的持久性。在我的应用程序中,我可以向某个实体添加类别。如果我选择一个并决定不使用它(从而再次删除类别)我已经被NHibernate加载并将保留在会话的第一级缓存中。现在,如果其他一些用户删除了这个类别并且我尝试保存我的实体,那么我的应用程序会抛出异常,因为加载的对象不再存在。

我的问题:有没有办法检查我的缓存是否已经加载了不再存在的项目?如果有的话,有没有办法从我的缓存中删除不存在的实体?

那会发生什么: 我加载一个实体(添加到会话缓存) 我添加一个类别(添加到会话缓存) 其他人从数据库中删除该类别。 我保存了我的实体,因为该类别不再存在而发生异常。

它仍然在会话缓存中。如果我可以(自动)从会话缓存中删除它会很好吗?有没有办法清理缓存并删除不再存在的对象?

问候,特德

1 个答案:

答案 0 :(得分:2)

NHibernate中没有选项可以自动执行,至少不能使用ISession。您可以使用IStatelessSession进行加载,因为它没有第一级缓存,但您将失去ISession提供的许多other features

您也可以调用ISession.Clear()清除会话(第一级)缓存,或ISession.Evict()从会话中驱逐某些实体,但这不是自动的。

您保留会话对象多长时间?也许您需要一个不同的会话管理context

如果会话的生命周期较短,您仍然可以使用second-level cache实现实体缓存。 SysCache2second-level cache providers之一,支持SqlCacheDependency。这意味着您可以在数据库中的某些对象发生更改时设置缓存过期。