9

私はNHibernateの実装とレイジーロードを使ってプロジェクトを持っています。 私はこのプロジェクトに2つのクラスを持っています:人と家族。 これらの2つの間の関係は集約であり、PersonにPersonのリストがあることを意味します。 Mapingは次のとおりです。このプロジェクトでカスケードのエラー:削除されたオブジェクトがカスケードによって再保存される

<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によって人物を取得、その後の家族の人の家族を削除します。 deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

どのように私は人の家族を削除することができます。このメッセージで例外をスローするので

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

家族、削除されていませんか?

答えて

13

基本的に、NHibernateは、あなたが明示的に家族のためのレコードを削除するように指示しているということです。そして、あなたがその人を再保存すると、その人はまだ参照を持っているためそれを家族のリストに追加する。

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

+2

'person.Families.Remove(fam); SessionInstance.Save(人); ' –

+0

@Cole W:まったく。 – KeithS

関連する問題