同じ識別子値を持つ別のオブジェクトがすでにセッション:10、エンティティ:Sales.Entities.Ttable1に関連付けられていました

session.update(オブジェクト)を使用するとエラーが発生し、このエラーを修正する方法はありますか? 私はまだSession.evict(オブジェクト)を試したが、それはまだ以下のエラーのために解決されていない

 a different object with the same identifier value was already associated with the           session: 10, of entity: Sales.Entities.TTable
6
正しい答えを記入してください!
追加された 著者 Joel,

3 答え

あなたのアプリケーションはWebアプリケーションですか?

Session.Merge(object)を使用します。

Webアプリケーションでは、時にはオブジェクトのシリアライズとデシリアライズを行います。新しいオブジェクトを作成するので、NHibernateオブジェクトが同じIDを持っていても、オブジェクト参照は異なります。次に、deシリアル化されたオブジェクトを更新しようとすると、NHibernateはIDが同じだが参照ポインタが異なる別のオブジェクトを検出するため、メモリ内のどのオブジェクトが「正しい」ものであるかわかりません。

Merge()メソッドがこのような場合に使用されるため、Webアプリケーション内のオブジェクトを更新できます。

17
追加された

Session.Update(オブジェクト)の前にSession.Clear()を使用します。

6
追加された
Clearメソッドは作業ユニットをクリアします(フラッシュされていない変更があれば、それらは破棄されます)。セッションにロードされたすべてのインスタンスで Evict を呼び出したように動作します。あなたは症状を取り除いて問題を隠しています。どちらが悪いですか?
追加された 著者 JiBéDoublevé,

何を達成しようとしていますが、エラーは、すでに内部キャッシュを持っていて、別のオブジェクト参照を送信している、休止状態のオブジェクトを更新しようとしていることを意味します。

Session.Mergeを使用することも可能ですが、ほとんどの場合、Webコンテキストの場合は、リクエストごとにSessionを使用する可能性が最も高いため、参照はすでにどこかにあるはずです。だから問題は:

  • キャッシュに保存しようとしているオブジェクトを持っていますが、使用していないのはなぜですか?
4
追加された