2

親エンティティにアクセスするたびに、Web サービスから更新する必要がある子エンティティのコレクションを持つ親エンティティがあります。コレクションに対して Clear() を実行し、Web サービスから受け取ったエンティティのリストを追加するだけでよいと考えました。受け取ったエンティティの ID がクリアしたものと同じでない場合は問題なく動作するようですが、いずれかの ID が同じ場合は NonUniqueObjectException が発生します。私はそれらをクリアしているので、新しいエンティティが挿入される前にそれらを削除すべきではありませんか? ID が同じであることが重要なのはなぜですか?

4

3 に答える 3

1

ID は同じですが、オブジェクト自体は実際には同じではありません。yourobject を実行することでこれを確認できます。ウォッチの GetHashCode() 。

NHibernate は、これが新しいデータベース オブジェクトであると判断し、挿入しようとしています。

元のオブジェクトを保持し、新しい値をそれにコピーする必要があります。

これらの値はプロパティごとに手動でコピーできますが、これを動的にすることをお勧めします。これにより、オブジェクト タイプごとにメソッドが必要なくなります。

リフレクションを使用して独自の動的メソッドを作成するか、サードパーティのマッパーを使用できます... AutoMapper を試してくださいhttps://github.com/AutoMapper/AutoMapper

プロパティをコピーするときは注意してください。chil オブジェクトにマップされている子がさらにある場合、同じ問題が再び発生します。

于 2013-04-24T23:43:02.873 に答える