2013-02-05 88 views
0

應用程序組件: NHibernate 3.3 FluentNHibernate 1.3 我只在此刻使用Automapping(也許這就是問題)。NHibernate只保存對象的一部分

我是NHibernate的新手,所以這可能是一個簡單的問題。

這裏是基本結構(不是實際的類)。

class Family 
{ 
    public virtual Guid ID { get; set; } 
    public virtual IList<Person> Members { get; set; } 
} 
class Person 
{ 
    public virtual Guid ID { get; set; } 
    public virtual Family Family { get; set; } 
    public virtual string Name { get; set; } 
} 

我有一個人的「編輯」視圖,它將ID作爲參數。 Action然後通過ID加載Person對象並呈現視圖。

的問題是,當我再改變的東西,並張貼回來,Person對象的Family成員是空的,因此當它的保存,這個人不再有家庭:(

我嘗試添加一個「FAMILYID 「屬性,然後將它作爲視圖中的隱藏屬性,但是NHibernate存在一個問題(我可以發佈錯誤,如果這是錯誤的方式)。

我可以加載Person對象,當它被回發,然後只是複製一些信息,但這似乎是錯誤的...

任何幫助將不勝感激。

回答

2

當它貼後背,我可以加載Person對象,然後只要複製 了一些信息,但似乎我錯了......

如果你沒有相應的輸入域您視圖中的家庭屬性這些值將永遠不會發送回您的控制器。因此,在更新Person對象之前,您應該使用FamilyID(您將使用隱藏字段發送)從數據庫中檢索它們。這是正確的流程。


UPDATE:

這是說處理這種情況的最好方法是使用視圖模型(杜)。因此,您將設計一個視圖模型,該視圖模型將僅包含應該由視圖中的用戶編輯的屬性。然後,您將視圖強制鍵入視圖模型,並且您的HttpPost控制器操作將視圖模型作爲參數。在此操作中,您將加載需要從數據庫更新的整個Person域,設置從視圖模型修改的屬性(使用諸如AutoMapper之類的工具很簡單),然後將域模型保留到數據庫。只有屬於該視圖一部分的屬性纔會從此Person域模型中修改。

+0

所以,如果我有說10-15引用不同的對象(「最好的朋友」是'公共虛者BestFriend'等),我需要加載它們中的每一個,只是爲了堅持一個對象?這似乎是矯枉過正。另一個問題是NHibernate(或者我使用的FluentNHibernate)似乎不允許我在類上同時擁有「Family」對象和「FamilyID」對象。 – Martin

+0

是的,你需要加載所有的參考。您可以使用INNER JOIN在單個SQL查詢中執行此操作以優化性能。但顯然,實現這一目標的最佳方式是使用視圖模型,該視圖模型僅包含應該在視圖中編輯的屬性。然後在您的控制器動作中,您將在單個查詢中從數據庫加載整個Person模型,使用AutoMapper等工具從視圖模型更新域模型的屬性,並使用NHibernate保留您的域模型。 AutoMapper使這個場景非常簡單。 –

+0

我來看一下AutoMapper,它的意思是1個額外的查詢來從數據庫中獲取對象,但我想這並不是那麼糟糕。 – Martin