2011-09-15 35 views
0

SPACE_SHIPオブジェクトとWEAPONオブジェクトがあるとします。 SPACE_SHIPには、1つの主要なWEAPONと2つ目のWEAPONの集合があります。プライマリとセカンダリウェポンを切り替えるにはどうしたらよいですか?nhibernate:削除せずにコレクションからオブジェクトを削除する

私が行う場合:

  1. mySpaceShip.SecondaryWeapons.Add(mySpaceShip.PrimaryWeapon)
  2. mySpaceShip.PrimaryWeapon = theSecondaryWeaponToSwitch
  3. mySpaceShip.SecondaryWeapons.Remove(theSecondaryWeaponToSwitch)

NHibernateはエラーが発生します...どうすればよいですか?

コンテキスト:NHibernateは1.2、C#3.5

+0

エンティティ間でプライマリとセカンダリの武器を切り替えると、エンティティが交換可能であるため、プライマリとセカンドのような2つの別個のエンティティが必要ありません。武器クラスが1つだけ必要です。ない。 –

+0

はい、これを理解しましたが、これは古いコードです... –

+0

*何のエラーがありますか? –

答えて

1

あなたはおそらくcascade="all-delete-orphan"でそれをマッピングされました。そのとき、NHはコレクションから削除されたすべてのインスタンスを削除します。そのインスタンスを別のコレクションで使用しようとすると、NHは文句を言います。

NHは、どのインスタンスが参照され、どのインスタンスが参照されていないかを自動的に検出する「永続ガベージコレクション」を実装していません。これはパフォーマンスがあまりにも強すぎます。 "delete-orphan"は単純化されたバージョンで、多くの単純なケースでは機能しますが、インスタンスを移動するとうまくいかない場合があります。

+0

'all-delete-orphan'の代わりに何をすべきですか? –

+1

'cascade =" all "'親が削除されたときに要素を削除したい場合(同時に2つのコレクションにあるべきではありません)。 'cascade =" none "'要素が同時に複数のコレクションに存在する可能性がある場合。この場合、コード内に要素を別々に( 'Safe')挿入して削除する必要があります。 –

関連する問題