我在使用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()以从数据库中获取当前值。