0

システム全体を NH1.2 から NH3.3 にアップグレード中です。(以前の開発者による) システムの一般的なシナリオは、多数のオブジェクトをデタッチしてそれらを Web セッションに格納し、IHttpModule を介して要求ごとにアタッチすることでした。

NHProf を実行している単純なページの読み込みで、これらのオブジェクトが現在アタッチされているため、変更されていないにもかかわらず、データベースで更新されるようになっていることに気付きました。

添付する以前のコード (NH1.2) は、次の行に沿っていました。

if (((NHibernate.Impl.SessionImpl)session).IsSaved(obj)
   session.Lock(obj, LockMode.None)

IsSaved が削除されたように見えるため、コードは次のようになります。

もし (obj != null)
   session.Lock(obj, LockMode.None)

私の理解では、LockMode.None によってデータベースが更新されるべきではないということでした。一部のオブジェクトにはバージョンがあり、他のオブジェクトにはありません。どちらも更新中です。

アドバイスをいただければ幸いです。

4

1 に答える 1

0

アナロジーで説明すると思います。違いを見てください。

var obj = _nhibernateSession.Load<MyObject>(id);
obj.Title = "Some Title";
_nhibernateSession.Transaction.Commit();

var obj = someObjectInMemoryNotInSession as MyObject;
obj.Title = "Some Title";
_nhibernateSession.Update(obj);
_nhibernateSession.Transaction.Commit();

違いに気づきましたか?最初の場合、objはセッションから取得され、セッションはその変更を認識しているため、更新は必要ありませんが、2番目の例では、明示的にUpdateを呼び出す必要があります。セッションから切り離されます。

今あなたの質問に:ステートメント:

if (((NHibernate.Impl.SessionImpl)session).IsSaved(obj)
   session.Lock(obj, LockMode.None)

NH1.2ではうまく機能しました。これは、このように最初のケース(エンティティがセッションからロードされる場合)でしたが、2番目のアプローチを使用するためです。

if (obj != null)
   session.Lock(obj, LockMode.None)

また、セッションからobjをロードしないため、NHibernateがデータベースの更新をトリガーします。

これを回避したい場合は、次の場合の前にGet()を呼び出してください。

obj = session.Get(id, LockMode.None);

または単に:

obj = session.Get(id);

両方があなたの場合の仕事をします。

于 2012-10-03T08:45:38.467 に答える