【发布时间】:2013-03-26 03:10:29
【问题描述】:
我正在尝试使用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)].
由于公司保密政策,查询已被修改。
帮助非常感谢。
【问题讨论】:
-
这听起来可能很傻,但有一次在一个项目中,我们将数据库从 SQLServer 转移到 Oracle,并且我们通过 oracle PL/SQL 开发人员连接到它。我会通过 oracle 客户端手动对其进行更改,然后运行我的应用程序并返回旧值,而不是更新后的值。结果我不得不手动
COMMIT数据库插入/更新。 -
@Carlos。只是为了确认您在执行
QueryOver之前检查数据库MyEntity.Name是否填充了“modified_name”?此外,this.session.Flush();行也是不必要的,因为对Commit()的调用将为您执行刷新。 -
@penfold:当然,在执行
queryOver()之前,该名称已成功填充到数据库中,因为我在执行查询之后设置了一个断点,并且我检查了数据库是否已更新。感谢您提供有关session.FLush().的更多信息 -
@mridula,当你说 原来我必须手动提交数据库插入/更新时,我不明白你的意思。。你做了什么来获得最新的变化?
-
好吧,在使用 oracle 客户端对记录进行更改后,我必须运行
commit命令才能使更改在数据库中生效。我习惯使用 SQLServer,它不需要本手册commit。所以当我运行我的应用程序时,这些更改是不可见的,因为我没有commited 他们。
标签: nhibernate nhibernate-criteria queryover