2

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

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

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

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

问候,特德

4

1 回答 1

2

NHibernate 中没有自动执行此操作的选项,至少不能使用ISession. 您可以IStatelessSession用于加载,因为它没有一级缓存,但您将失去许多其他提供的功能ISession

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

您将会话对象保留多长时间?也许您需要不同的会话管理上下文

如果会话的生命周期较短,您仍然可以实现实体缓存,但使用二级缓存SysCache2是支持. _ SqlCacheDependency这意味着您可以在数据库中的某些对象更改时设置缓存过期。

于 2012-07-24T09:00:42.497 回答