を使用してデータベースから更新されたレコードを取得しようとしています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>();
前のステートメントは、レコードが 1 つしかない (良い) コレクションを取得しますが、「 modified_name」ではなく古い値で確立された name プロパティを使用します。
この動作を修正するにはどうすればよいですか? 第 1 レベルのキャッシュが気になりますか? 同じ問題が発生します
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();
}
}
SaveEntity のために NHibernate によって生成された 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)].
会社の機密ポリシーにより、クエリが変更されました。
大変助かりました。