为什么NHibernate在更新时不会从二级缓存中删除实体?

时间:2011-08-11 09:47:15

标签: nhibernate

我正在使用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的名字仍然是旧名称,而不是我刚刚更新它的新名称!

3 个答案:

答案 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。