2011-08-11 4 views
1

私は非常に基本的なクエリを持っています。私はISessionによって読み込まれているオブジェクトを編集するためにWPFバインディングを使用しています。双方向バインディングとステートフルセッションのために、誰かがフォーム内のこのオブジェクトを編集すると、セッションを閉じるたびに、フォームで行われたオブジェクトへの変更がデータベースに戻されます。これを避ける最善の方法はどれですか?私が知っているnHibernate:オブジェクトの元の状態をリセットする

方法:

  1. シャドウは、オブジェクトをコピーし、DataContext(私は今のよう使用しています方法)としてコピーしたオブジェクトを使用します。
  2. ISession.Clear
  3. IStatelessSessionを使用してください。

ISessionを閉じる前にオブジェクトをオリジナルのフォームにリセットする方法はありますか?

答えて

1

あなたがここを見ている場合:http://nhforge.org/wikis/howtonh/finding-dirty-properties-in-nhibernate.aspx

をそれは汚れた性質を見つけることの一例です。 NHibernateはEntityEntryオブジェクトを介して持続的なオブジェクトの状態を内部的に追跡します。

これは、上記の方法を少し変更すると、プロパティをリセットするために使用できる古い値を戻すことができるため、これは役に立ちます。

セッションを閉じてオブジェクトをデータベースにフラッシュさせるために、セッションFlushModeをFlushMode.Neverに設定できます。これは、Session.Flush()を呼び出すまでデータベースの同期が行われないことを意味します。

また、IFlushEntityEventListenerにフックして、オブジェクトの状態をリセットすることもできます。 GoogleでNHibernateイベントシステムを使用する合理的な例があります。

+0

この例は私にとってそれでした。ありがとう。しかし、「Session.Flush()を呼び出すまでデータベースの同期は行われません」というステートメントは間違っています。トランザクションを使用している場合、 'FlushMode'の設定に関係なく、コミットはデータベースを同期します。 – Yogesh

+0

私はあなたがトランザクションを使用していないと仮定していました。あなたがデータを更新しない場合のポイントは何ですか? –

+0

私は1つを使用していると言っているわけではありませんが、私はただ例外があることを明確にしています。 :) – Yogesh

0

私はトランザクションの使用を提案します。その場合、トランザクションをロールバックするだけですか?どう思いますか?

+0

a)これは、分離レベルに応じて、行をロックする可能性のある不要なトランザクションです。 –

+0

b)オブジェクトをリセットするのに役立たない。 –

+0

うわー!私はこれを正しく聞いています "トランザクションは不要です" – Baz1nga

1

NHibernate ForgeManaging the cachesを見る

フラッシュ()が続いて呼び出され、そのオブジェクトの状態をデータベースと同期されます。この同期を行わない場合や、膨大な数のオブジェクトを処理していて効率的にメモリを管理する必要がある場合は、Evict()メソッドを使用してオブジェクトとそのコレクションを1次キャッシュから削除できます。

私はあなたの欲しいもののように思えます。

関連する問題