NHibernateを使用して、私は通常、Get()またはLoad()メソッドを使用して単一のレコードを照会します(プロキシが必要かどうかによって異なります)。
SomeEntity obj = session.Get<SomeEntity>(new PrimaryKeyId(1));
ここで、以下の例のように、このステートメントを2回実行すると、単体テストで実行されているクエリは1つだけになります。
SomeEntity obj1 = session.Get<SomeEntity>(new PrimaryKeyId(1));
SomeEntity obj2 = session.Get<SomeEntity>(new PrimaryKeyId(1));
ここまでは順調ですね。しかし、ICriteriaクエリを使用して同じオブジェクトを取得すると、奇妙な動作に気づきました。以下のコードを確認してください。最初のオブジェクトインスタンスを取得します。次に、プロパティの値を10(データベースの値は8)に変更し、別のインスタンスを取得して、最後に2番目のオブジェクトインスタンスの値を確認します。
//get the first object instance.
SomeEntity obj1 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();
//the value in the database and the property is 8 at this point. Let's set it to 10.
obj1.SomeValue = 10;
//get the second object instance.
SomeEntity obj2 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();
//check if the values match.
Assert.AreEqual(8, obj2.SomeValue);
新しいクエリでオブジェクトを要求したにもかかわらず、値がobj2の10であるため、何らかの理由でアサートが失敗します。面白いことに、ユニットテストの出力ウィンドウに従って実行されているまったく同じselectクエリが2つあります。私の質問:2番目のオブジェクトが第1レベルのキャッシュからフェッチされた場合、なぜ2つのクエリが実行されるのですか?
私は何かが足りないのですか、それともこれはバグですか?
よろしく、テッド
編集#1:NHibernate v2.1.2GAの使用編集#2:実行されている2つのクエリに関する説明を最後の段落に追加しました。