我在使用Nhibernate缓存对象并返回旧版本时遇到问题:

这是我正在运行的代码

public IList<Foo> GetFoos()
{
  return _session.Query<Foo>().Where(f => f.State == 0).ToList();
}

public void Update(Foo foo)
{
  foo.State = 1;

  _session.Transaction.Begin();
  _session.Update(foo);
  _session.Transaction.Commit();
}


如果我在数据库中的状态0中有10个Foos,并且我调用GetFoos,则会得到状态为0的10个Foo对象,那就太好了。

如果我在每个Foo上调用Update,数据库将在状态1中显示10个foos,那就太好了。

现在,如果我调用GetFoos,我将得到0个Foo对象,那就太好了。

如果外部应用程序将所有Foos的状态更改为状态0,并且运行GetFoos方法,我将返回10个对象,那就太好了。但是所有对象的状态均为1 !!!!!!,那太糟糕了!

现在,如果我对所有foo都调用Update,则数据库不会更新,因为Nhibernate认为没有任何变化,因此它们永远保持数据库的状态0。

我的配置有问题吗,还是这种预期的行为?
如何获得对象以返回正确的新值?

谢谢

最佳答案

会话(ISession实例)加载的实体将保留在一级缓存中。您可以全部清除它们(ISession.Clear()),也可以手动调用每个ISession.Refresh()以从数据库中获取当前值。

09-25 18:30