9

私はNHibernateの実装と遅延読み込みを使用したプロジェクトを持っています。このプロジェクトには、Person と Family の 2 つのクラスがあります。これらの 2 つの関係は集計であり、Person が Person のリストを持つことを意味します。マッピングは次のとおりです。

  <class name="Person" table="Person_Person" >

    <id name="Id" type="Int64" unsaved-value="0">
      <generator class="native" />
    </id>

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="Domain.Entities.Family,Domain.Entities"/>
    </bag>

  </class>

このプロジェクトでは、ID で人を取得してから、家族の家族の人を削除します。

Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
    if (fam.Name == "Jaun")
        SessionInstance.Delete(fam);

このメッセージで例外がスローされるため、ファミリは削除されませんでした: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

個人の家族を削除するにはどうすればよいですか?

4

1 に答える 1

13

基本的に、NHibernateが不満を言っているのは、Familyのレコードを削除するように明示的に指示していることです。その後、Personを再保存すると、Personはまだその参照を持っているため、Familyは元の場所に戻されます。家族のリスト。

代わりに、NHibernateは、NHibernateが使用できるオブジェクト指向の方法でこの関係を処理するように指示しています。Person.Familiesリストから「Jaun」ファミリーへの参照を削除してから、Personを永続化します。これを行うと、NHibernateはその家族とその人の間の関係を削除します。ファミリが他のオブジェクトから参照されなくなった場合、Cascadeプロパティを「all-delete-orphan」に設定しているため、「Jaun」ファミリレコードはDBから完全に削除されます。

于 2011-10-31T14:28:07.510 に答える