我正在尝试使用从数据库更新记录QueryOver
。我的代码最初创建一个实体并保存在数据库中,然后在外部(从其他程序、手动或在其他机器上运行的同一程序)在数据库中更新相同的记录,当我queryOver
通过更改的字段调用过滤时,查询得到记录但没有最新的变化。
这是我的代码:
//create the entity and save in database
MyEntity myEntity = CreateDummyEntity();
myEntity.Name = "new_name";
MyService.SaveEntity(myEntity);
// now the entity is updated externally changing the name property with the
// "modified_name" value (for example manually in TOAD, SQL Server,etc..)
//get the entity with QueryOver
var result = NhibernateHelper.Session
.QueryOver<MyEntity>()
.Where(param => param.Name == "modified_name")
.List<T>();
前面的语句获得了一个只有一条记录(好)的集合,但name 属性是用旧值而不是“modified_name”建立的。
我该如何解决这种行为?一级缓存打扰我了?同样的问题发生在
CreateCriteria<T>();
由于应用程序框架的要求,我的 NhibernateHelper 中的会话不会在任何时候关闭,只会为与 session.Save() 关联的每个提交创建事务。如果我打开一个新会话来执行查询,显然我会从数据库中获得最新的更改,但设计要求不允许这种方法。
此外,我在 NHibernate SQL 输出中检查了正在执行带有 WHERE 子句的选择(因此 Nhibernate 命中数据库)但不更新返回的对象!!!!
更新
这是调用 session.Save 后 SaveEntity 中的代码:完成对 Commit 方法的调用
public virtual void Commit()
{
try
{
this.session.Flush();
this.transaction.Commit();
}
catch
{
this.transaction.Rollback();
throw;
}
finally
{
this.transaction = this.session.BeginTransaction();
}
}
NHibernate 为 SaveEntity 生成的 SQL:
NHibernate: INSERT INTO MYCOMPANY.MYENTITY (NAME) VALUES (:p0);:p0 = 'new_name'.
NHibernate 为 QueryOver 生成的 SQL:
NHibernate: SELECT this_.NAME as NAME26_0_
FROM MYCOMPANY.MYENTITY this_
WHERE this_.NAME = :p0;:p0 = 'modified_name' [Type: String (0)].
由于公司保密政策,查询已被修改。
非常感谢帮助。