2012-03-14 14 views
1

これに対して簡単な答えがあるはずです。私は単純な親子関係でこれを行う方法の多くの例を見てきましたが、3番目のテーブルがあるときにそれを行う方法がわかりません。私もNHibernateに比較的新しいので、私と一緒に裸をしてください。NHibernate - 参照されたオブジェクトが削除されたときに外部キーをnullに設定する

PhoneNumberのリストを持つPhoneBookクラスがあります。次に、PhoneNumberを参照する別のクラス「Account」があります。この参照はヌル入力可能なため、アカウントに電話番号を付ける必要はありません。

電話帳を保存し、すべての電話番号を保存/更新/削除することができます。電話番号のいずれかが削除されている場合は、この番号を使用しているアカウントをすべて無効にします。最後の部分を除いてすべてが機能しています。私が使用している電話番号を削除すると、そのアカウントも削除されますが、それは起こりたくないので、参照を消去してください。私のカスケードやマッピングが間違っているだけなので、私はそれを設定するのか分からないと確信しています。

実際に保存するコードは比較的簡単です。ちなみに、誰かが私が電話番号が削除されていることを確認するためにマージする必要がある理由を教えてくれればすばらしいだろう。

var session = SessionFactory.GetCurrentSession(); 
book = (PhoneBookDto) session.Merge(book); 
session.SaveOrUpdate(book); 

現在、関連するマッピング:

PhoneBook.hbm.xml

... 
<bag cascade="all-delete-orphan" inverse="true" name="PhoneNumbers"> 
    <key> 
    <column name="phone_book_id" /> 
    </key> 
    <one-to-many class="DataLibrary.dto.PhoneNumberDto, DataLibrary" /> 
</bag> 
... 

PhoneNumber.hbm.xml

... 

<many-to-one cascade="none" class="DataLibrary.dto.PhoneBookDto, DataLibrary" name="PhoneBook"> 
    <column name="phone_book_id" /> 
</many-to-one> 

... 

Account.hbm.xml

... 

<many-to-one cascade="none" class="DataLibrary.dto.PhoneNumberDto, DataLibrary" name="PhoneNumber"> 
    <column name="phone_number_id" /> 
</many-to-one> 

... 

ありがとうございます!

編集:

:フィーロが正しい方向に私を指摘

、私は本当にそれを必要とし、また逆= falseのようにそれを設定していないにもかかわらず、アカウントに戻ってのPhoneNumberにコレクションを設定する必要がありました

<bag cascade="none" inverse="false" name="Accounts"> 
    <key> 
    <column name="phone_number_id" /> 
    </key> 
    <one-to-many class="DataLibrary.dto.AccountDto, DataLibrary" /> 
</bag> 

私がそれをしたとき、それは働いた。これを行う方法はありますか?PhoneNumberとAccountの関連付けを行う必要はありませんか?

+0

あなたはCascade.removeでのPhoneNumberでアカウントのコレクションを持っています:

ための多分

は "それはあまりにもアカウントを削除しますか"? – Firo

答えて

1

「私は必ず電話番号を作るためにマージする必要がなぜ削除されます」:あなたは(本がロードされたとクローズセッション)changetrackingのうち、電話番号を削除するので

いずれか、またはフラッシュなしでは存在しないため、最後にマージするとすぐにSaveOrUpdateがフラッシュされ、次のsession.Flush()で実行されるバッチにのみ追加されます。

<bag cascade="all" class="Account" name="Accounts"> 
</bag> 
+0

私は実際にPhoneNumberからAccountへの関連付けを持っていませんでした。しかし、私はそれを追加しようとしました: Eric

+0

実際これは正しい方向に私を指摘しました。 <列名が=「phone_number_id」/> <バッグカスケードは=「なし」逆=「false」の名前=「アカウント」>:実際に収集行い、また逆がfalseに設定されたことを確認します Eric

関連する問題