Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么NHibernate在更新实体时不从二级缓存中删除实体?_Nhibernate - Fatal编程技术网

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

为什么NHibernate在更新实体时不从二级缓存中删除实体?,nhibernate,Nhibernate,我使用的是SysCache2和nhibernate2.1.2.4 无论我如何努力,NHibernate都会继续加载实体的以前实例 我的类映射为可缓存的读写 缓存区域是默认值,即类类型的全名 我正在执行事务中的所有操作 数据库肯定正在更新,当我手动清除ASP.NET的缓存时,问题就消失了 我正在做一个简单的更新,如下所示: using(var transaction = NHSession.BeginTransaction()) { var foo = Session.Load<Fo

我使用的是SysCache2和nhibernate2.1.2.4

无论我如何努力,NHibernate都会继续加载实体的以前实例

我的类映射为可缓存的读写

缓存区域是默认值,即类类型的全名

我正在执行事务中的所有操作

数据库肯定正在更新,当我手动清除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();
}
使用(var transaction=NHSession.BeginTransaction())
{
var foo=Session.Load(\u fooId);
foo.Name=“一个新名字”;
Commit();
}
然后稍后(在应用程序中的不同会话中)重新加载实体,如下所示:

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();
}
使用(var transaction=NHSession.BeginTransaction())
{
var foo=Session.Load(\u fooId);
响应。写入(foo.Name);
Commit();
}

。。。但是富的名字仍然是旧名字,而不是我刚刚更新的新名字

我将记录所有与缓存相关的消息,并查看是否在提交第二个事务时更新缓存。下面是用于记录缓存消息的log4net配置示例。。。



为什么要使用Load而不是Get?我怀疑这与问题有关。解释差异,但不涉及任何特定于您的问题。尽管如此,我还是会尝试切换到Get。

我解决了这个问题——出于某些原因,我有两个会话工厂。我没有意识到保存操作发生在一个工厂中,而加载发生在另一个工厂中。

我不明白这是怎么回事-加载仅用于加载代理,而Get会立即检索整个实体。除此之外,我不知道它们与缓存有什么关系。Get会检查一级和二级缓存。最大的区别是Load永远不会返回null;如果实体不存在,Get将返回null。加载一个属性,然后立即访问它的ID以外的属性,这是没有任何意义的,就像您正在做的那样。我的猜测是缓存的实体没有更新,因为您正在更新代理,而不是实际的实体。我认为这没有意义-一旦您设置了代理的属性,它就应该取消自身的固定。您好,谢谢,我检查了日志,更新时实体没有失效。