0

CarというNhibernateオブジェクトがあります。このCarオブジェクトには、DoorsというPersietentBag IListコレクションがあり、すべて遅延読み込みされています。

もしそうなら(セッション1)

int singleDoor = Car.Doors[0];

最も怠惰なコレクションがdbからロードされ、関連するオブジェクトが第1レベルのキャッシュに追加されます。iは第1レベルのキャッシュにN個のオブジェクトCarとNDoorsがdbからロードされます。

別の手から(セッション2のコードの他の部分で)同じCarオブジェクトをロードし、同じ割り当てを行います

int singleDoor = Car,Doors[0];

およびiSESSION2からCarおよびすべてのDoor(s)オブジェクトを削除します

このオブジェクトの状態を変更し、保存と実行のためにSESSION1に接続されたオブジェクトをアタッチしたい

mySession.Update(Car);

しかし、Door(s)オブジェクトを更新しようとすると、明らかに同じIDを持つ別のオブジェクトがあるため、(同じIDを持つ他のオブジェクトなど)例外がスローされます。

ボットは、削除する古いオブジェクトを見つけるのが難しいのですが、どうすれば古いオブジェクトを削除したり、第1レベルのキャッシュをクリアしたり(タイプとIDのみ)、古いオブジェクトをキャッシュから破棄して必要なものを更新したりできますか?

前もって感謝します。

4

1 に答える 1

3

これは、第2レベルのキャッシュが原因ではなく、セッション1に既にロードされているときにセッション2からエンティティを保存しようとしているためです(実際、これを引き起こしているのは第1レベルのキャッシュです)。

あなたの質問への答えは、(セッション1で)session.Evict(car)を使用することですが、それは実際には最善のアプローチではありません-セッション1で永続オブジェクトを更新しないsession.Merge(car)を使用することをお勧めします同じIDを持つ別のオブジェクトに関する例外をスローします。

于 2012-05-22T08:15:51.970 に答える