我正在使用SysCache2和NHibernate 2.1.2.4。
无论我怎么努力,NHibernate都会不断加载实体的先前实例。
我的类被映射为可缓存的ReadWrite。
缓存区域是默认值,即类类型的全名。
我正在执行交易中的所有操作。
数据库肯定正在更新,当我手动清除ASP .NET的缓存时,问题就消失了。
我正在做一个简单的更新,如下所示:
using(var transaction = NHSession.BeginTransaction())
{
var foo = Session.Load<Foo>(_fooId);
foo.Name = "A new name";
transaction.Commit();
}
然后我稍后重新加载实体(在应用程序内的另一个会话中),如下所示:
using(var transaction = NHSession.BeginTransaction())
{
var foo = Session.Load<Foo>(_fooId);
Response.Write(foo.Name);
transaction.Commit();
}
...但是Foo的名字仍然是旧名称,而不是我刚刚更新它的新名称!
答案 0 :(得分:1)
我会记录所有与缓存相关的消息,并查看在提交第二个事务时是否更新了缓存。这是一个示例log4net配置来记录缓存消息......
<logger name="NHibernate.Cache.ReadWriteCache" additivity="false">
<level value="ALL"/>
<appender-ref ref="Console"/>
</logger>
<logger name="NHibernate.Cache.ReadWriteCache" additivity="false">
<level value="ALL"/>
<appender-ref ref="Console"/>
</logger>
答案 1 :(得分:1)
我解决了这个问题 - 出于某些原因,我有两个会议工厂。我没有意识到保存操作发生在一个工厂内,负载发生在另一个工厂中。
答案 2 :(得分:0)
为什么使用Load而不是Get?我怀疑这与问题有关。 This article解释了这些差异,但没有涉及您问题的具体内容。不过,我会尝试切换到Get。