6

我遇到了一个明显的缓存问题,NHibernate 返回的内容与数据库中的内容不匹配。

我相信这是二级缓存数据。看起来我可以使用 Evict 来执行此操作,但实际上应该何时调用 Evict 方法? 对于我的特定应用程序,数据对于用户来说将是唯一的,并且提供的数据可能只会使用一次*。

我可以完全禁用这些对象集的 Level2 缓存吗?

更新 10/31

我的场景是这样的:我有一个购物车,客户将在其中添加和删除商品。我正在做的事情如下:在处理购物车的更新之前,我驱逐了CartandCartProduct实体。完成此操作后,我从提供程序检索列表CartProducts并返回视图(这发生在 .NET MVC 控制器中)。

更新 11/3

购物车已经完成,我遇到了一个似乎与同一个 NHibernate 问题有关的问题,但实际上是一个 MVC 问题。深入挖掘发现 HTML Helper 扩展覆盖了我假设的值并替换为 Model 状态中的值。所以对这个是双重打击。希望这可以帮助某人。

4

1 回答 1

20

不,您不能禁用某些实体的缓存。

你有几个选择:

  1. 使用 ISession.Clear() 从 NHibernate 的缓存中清除所有实体。
  2. 使用 ISession.Evict( obj ) 从缓存中清除特定实体。
  3. 使用 ISessionFactory.Evict( typeof( obj ) ) 从缓存中逐出特定类型的所有实体/对象。在我看来,这将是最接近您想要的。
  4. 使用 IStatelessSession 从数据库中获取对象/实体,因为这完全绕过了所有缓存。
于 2012-10-30T03:20:21.247 回答