2011-09-24 162 views
1

想知道保存一個通常包含Child對象集合(在我的情況下爲多對多)的Parent的最佳做法,但Parent中的集合當前設置爲null,因爲它尚未加載?保存父對象的最佳方法

在我的情況下,父從網頁傳遞到我的服務層。該網頁僅從表單填充了Parent的簡單屬性。

我知道有幾個Child對象鏈接到數據庫中的Parent,但'children'屬性當前爲null。

如果我保存Parent,即使my的Children被設置爲cascade =「none」,當我保存Parent時,所有鏈接都會被刪除(我甚至可以看到NHibernate在日誌中發出的刪除語句)。

我能想到的幾種方法來解決這個問題:

1)seperately裝入孩子,然後父項的子集設置給他們,然後保存父(作品但這是一個額外的訪問數據庫) 。

2)僅使用HQL或Native SQL發佈簡單屬性的更新。

更新:我不確定我的級聯行爲實際上是否正常工作。從文檔,它建議NHibernate不會混亂我的收藏,除非級聯設置爲save-update,all-delete-orphan等。但這是我的映射

(來自Order.hbm.xml)

<bag name="OrderItems" table="order_item" cascade="none" lazy="true"> 
    <key column ="order_id" /> 
    <many-to-many class="MenuItem" column="item_id"/> 
</bag> 

當Order.OrderItems爲空,並且使用SaveOrUpdate(Order)保存我的Order對象時,它會明確地刪除集合。我希望他們得到保護。我的配置是錯誤的還是什麼?

謝謝

回答

1

我真的不會使用真正的父對象從UI傳遞數據到服務層。您可以改爲實現一個輕量級類(Data transfer object),該類僅包含這些基本屬性,然後將其傳遞給服務層並填充(手動或使用AutoMapper)父級的屬性。

+0

感謝您的回覆。我確實認爲,儘管說實話我只想擁有一套我認爲的域對象。我曾參與過大型項目(Java),其中維護DTO已成爲維護(保持與實體同步)的噩夢。目前,我已經使用HQL更新「查詢」解決了我的問題,該查詢只觸及了我當時關心的對象。雖然我確定NHibernate中必須有一個標誌來做我想做的事情,但它仍然很整潔。再次感謝 – Richard

+0

那麼在任何地方使用DTO當然不是強制性的,而是在最有意義的地方使用DTO。 –

相關問題