nHibernate不会检索手动更改的数据

时间:2020-03-06 14:41:34  来源:igfitidea点击:

nHibernate无法从存储库表中检索手动更改的数据?我也禁用了二级缓存,但看起来它(nhibernate)有时会从缓存中检索,有时会从存储库表中检索。

解决方案

我认为我们将不得不对自己的确切问题进行更多的描述才能得到答案。我对nhibernate的经验很少,但是如果没有一些代码,我真的无法复制正在发生的事情并尝试对其进行修复。

太具体了,很抱歉

Nhibernate正在检索数据,没有任何问题。
但是当我手动更改存储库表中的数据时。 Icriterea(nhibernate)有时是从缓存或者表中获取的。
我正在使用Icriteria功能:

ICriteria标准= session.CreateCriteria(typeof(xyzclass));

条件.Add(Expression.Eq(" xyzclass",somestringto retreivedata));
条件.SetCacheable(false);
返回条件.UniqueResult();

我从未真正使用过NHibernate的缓存功能,但我相信它的目的是完全消除对数据库的需求,这意味着它不会进行手动更改,因为它不知道他们。

我想确切地问一下我们要在这里实现什么,我们只是通过手动编辑数据库进行一些测试,还是在实时应用程序中进行常规活动?确实,应该修改数据库的唯一一件事就是应用程序,它通过NHibernate数据层进行,从而在此过程中更新和/或者弄脏缓存。

这只是测试的一部分。

但是将来我们可以手动编辑数据表。
我还为该表将lazy设置为false,并注释掉了hibernate使用的所有第二级缓存属性。
但是即使那样,它仍会返回给我不同的值,而不是新编辑的值。
有时它给了我旧的价值,有时给了我新的价值,所以它不是恒定的。

To completely evict all objects from the session cache, call ISession.Clear()
  
  For the second-level cache, there are methods defined on ISessionFactory for evicting the cached state of an instance, entire class, collection instance or entire collection role.

我不知道它是否可以解决我们遇到的问题,但是文档指出:

如果每次执行此操作时都对可能会更改带外数据的数据执行SELECT,则它应该执行我们想要的操作。

nhibernate中有两种类型的缓存:会话缓存和二级缓存。会话缓存始终会缓存该会话看到的对象,这是nhibernate知道哪些对象已更改并需要保留的方式。我们禁用的第二级缓存位于其下方。我们看到的缓存信息来自会话缓存。

如果应用程序需要查看其他源持久存储的更改(例如,手动数据库更改),则答案可能是创建更精细的会话。虽然SessionFactory在应用程序生命周期中一直存在,但应该更频繁地创建Session对象。例如,在Web应用程序中,每个请求都会生成自己的会话。

如果这不是一个选择,则session.Clear()将从会话中逐出所有对象。

与NHibernate的良好关系始终取决于强大的OO承诺,在大多数情况下,取决于数据更改的排他性。如果没有它,我们将看到一些令人讨厌的问题,并且会放弃NH可以提供的大多数非常好的功能。

可以说有一个名为" Foo"的类,该类映射到具有" Id"和" SomeProperty"列的表" Foo"。如果所有行的" SomeProperty"都已从" oldValue"手动更新为" newValue",并且NH向DB发送一些查询以询问所有Foos,其中SomeProperty =" newValue",则DB将按预期返回所有Foos。但是NH传递的Foo实例可能具有" oldValue",因为带有返回ID的Foo已经添加到会话上(换句话说,它位于一级缓存中)。

段落数量不匹配