Asp.net mvc NHibernate缓存问题-何时调用逐出?

Asp.net mvc NHibernate缓存问题-何时调用逐出?,asp.net-mvc,nhibernate,caching,evict,Asp.net Mvc,Nhibernate,Caching,Evict,我遇到了一个明显的缓存问题,NHibernate返回的内容与数据库中的内容不匹配 我相信这是二级缓存数据。看起来我可以使用execute来实现这一点,但是什么时候应该真正调用execute方法?对于我的特定应用程序,数据对于用户来说是唯一的,并且提供的数据可能只会使用一次* 我可以完全禁用这些对象集的二级缓存吗? 更新10/31 我的场景是这样的:我有一个购物车,客户将在其中添加和删除项目。我正在做的是:在处理购物车的更新之前,我退出购物车和购物车产品实体。完成后,我从提供程序中检索CartPr

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

我相信这是二级缓存数据。看起来我可以使用execute来实现这一点,但是什么时候应该真正调用execute方法?对于我的特定应用程序,数据对于用户来说是唯一的,并且提供的数据可能只会使用一次*

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

更新10/31

我的场景是这样的:我有一个购物车,客户将在其中添加和删除项目。我正在做的是:在处理购物车的更新之前,我退出
购物车
购物车产品
实体。完成后,我从提供程序中检索
CartProducts
列表并返回视图(这发生在.NET MVC控制器中)

更新11/3


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

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

您有几个选择:

  • 使用ISession.Clear()清除NHibernate缓存中的所有实体。
  • 使用ISession.execute(obj)从缓存中清除特定实体。
  • 使用ISessionFactory.execute(typeof(obj))从缓存中逐出特定类型的所有实体/对象。在我看来,这将是最接近你想要的。
  • 使用IStatelessSession从数据库获取对象/实体,因为这完全绕过了所有缓存。

  • 兰迪,谢谢你的链接。您能否详细说明evit的正确/预期用途?关于我的实际用法,我在上面做了一些注释,但这似乎是一种完全错误的方法。对我来说,在对DB做任何事情之前,必须先打电话驱逐是荒谬的。使用MySQL FWIW.execute()从NHibernate会话中移除/解除对象的关联。它的预期用途是当您不想将对象持久化/保存回数据库时。例如,您可以从数据库加载现有购物车,逐出()购物车实体,并在会话中持久化购物车实体。然后,当用户到达购物车的末尾时,您可以将其保存回数据库。该示例允许您的购物车不必在每次页面更改时从数据库重新加载。这是一个有点做作的例子,但听起来很合理。关于你的第二条评论和对你的问题的更新,是的,看起来确实有一些东西没有正确设置,因为你不应该真的需要从你的用例会话中逐出对象。不幸的是,在我们缩小真正的问题范围之前,我需要对您的应用程序有相当多的了解。一些需要研究的问题,确保您没有使用与视图模型相同的实体,确保您正在使用事务,确保在通过NHibernate会话进行处理之前正确提交事务。