1

データ アクセス層に NHibernate を使用しています。以前にロードしたメモリ内のエンティティがあり、後でデータベースに保存するために変更を加えています。私のアプリケーションが同時にいくつかのマシンで実行されていて、他のユーザーが私がメモリに持っていて保存したいのと同じオブジェクトをデータベースから削除したときに問題が発生します。変更を保存するか、このエンティティを削除しようとすると、StaleStateException が発生しました。

この方法のデータベース呼び出しsession.Get<T>でエンティティが存在するかどうかを確認します (正常に null を取得します)。

using (var session = NHibernateSessionHelper.OpenSession())
{
   using (var transaction = session.BeginTransaction())
   {
       var entity = session.Get<T>(persistObject.Id);
       return entity == null ? false : true;
   }
}

問題は、エンティティが他のセッション/ユーザーによって削除されたとき (したがって、メモリ内のエンティティが廃止されたとき) と、エンティティが最近作成されて保存できるときとを区別できない場合に発生します。独自の解決策は、エンティティを破棄するか続行時に保存するために、エンティティが既に保存されているかデータベースから読み込まれているかを確認するメカニズムを実装することだと思います。

nhibernate を使用してこの動作を確認する方法はありますか? 試してみましsession.Refresh() and session.Get<T>たが、オブジェクトが新しく、保存する準備ができているか、廃止されているかはまだわかりません。

大変助かりました。

4

1 に答える 1

1

あなたが持っている状況は、典型的なエラー処理です。ユーザーがデータベース内のオブジェクトを削除しようと決心し、他のユーザーが同じオブジェクトへの変更を保存したいので、正しい状態がどうあるべきかを言うことはできません。ユーザーは、状況をどうするかを決定する必要があります。彼にいくつかの選択肢を与えることで、エラー処理をよりスマートにすることができます。同じオブジェクトに書き込む複数のユーザーがいる状況では、他のユーザーが見なかった変更を上書きしないように、楽観的ロックなどのメガニズムも実装する必要があります。これらの状況が多数ある場合は、データベース/オブジェクト構造を再設計して一度に編集するデータを減らすか、ユーザーがシステムで行う作業/プロセスを再考する必要があります。

于 2013-03-15T08:28:13.883 に答える