2012-03-14 28 views
1

對於這個我很想念一個簡單的答案。我見過很多如何在簡單的父/子關係中執行此操作的示例,但我不確定在有第三個表時如何執行此操作。我對NHibernate也是比較新的,所以請和我一起裸照。NHibernate - 當引用對象被刪除時將外鍵設置爲空

我有一個PhoneBook類,它有一個PhoneNumber列表。然後我有另一個引用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> 

... 

提前致謝!

編輯:

FIRO我指出了正確的方向,我不得不設立******中國收集回賬戶,即使我並不真的需要它,而且還要把它設置爲inverse =假:

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

當我這樣做,它的工作。有沒有辦法做到這一點,所以我不必有PhoneNumber帳戶關聯?

+0

你有賬戶的******中國收藏與Cascade.remove? – Firo 2012-03-14 16:43:45

回答

1

「爲什麼我爲了確保電話號碼,以合併被刪除」:因爲你刪除PHONENUMBERS出changetracking(閉門會議與這本書是加載)的

要麼或者是因爲沒有同花順在合併結束時立即刷新SaveOrUpdate將只添加到在下一個session.Flush()執行的批處理。

「它太刪除賬戶」可能的

因爲:

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

我實際上沒有從PhoneNumber返回到Account的關聯。然而,我嘗試添加它: <一到一個級聯=「無」類=「DataLibrary.dto。AccountDto「name =」Account「/> 但是,該帳戶仍然被刪除:( 對不起,我似乎無法在評論中正確格式化 – Eric 2012-03-14 22:16:26

+0

其實,這確實指向我在正確的方向。真正使之成爲集,並確保反被設置爲false: <袋級聯=「無」逆=「假」名稱=「帳戶」> <列名=「phone_number_id」 /> <一對多課=「DataLibrary.dto.AccountDto,DataLibrary」/> – Eric 2012-03-14 22:33:31

相關問題