2009-11-19 85 views
2

實體NHibernate的更新參考

我們有一個實體,它使用NHibernate加載稱爲產品。

產品有一個類別,NHibernate很高興爲我填充。

數據庫

在數據庫中,產品具有的類別的外鍵。

方案

用戶編輯該產品(通過網絡接口),並選擇不同的類別(說的不是「魚」,我們選擇「素食」)。

這可能是一個下拉列表,顯示每個類別。當他們選擇不同的類別時,我們得到一個int鍵。

問題

顯然,我們現在要更改保存到產品,但實際上唯一的變化是保存新的int(比如說2,而不是1)。

因此,我們檢索現有產品,現在出現問題。

我們在產品上沒有「CategoryID」字段,我們只有一個Category屬性。

但是,我們並不真的想要檢索類別(通過ID)只是爲了將其分配給產品。

所以我想我想知道的是,我們應該......

一)一個類別id屬性添加到產品

B)創建一個新的類別,分配給它的相關標識,並附上對產品(但肯定會導致錯誤,或覆蓋現有類別)

C)檢索(查找)從系統(由ID類),並附上商品

d)做別的東西完全!

回答

2

更新:Session.Load是correct answer

product.Category = session.Load<Category>(2); 

session.Save(product); 
+0

是的,似乎工作。 我只有一個可以爲空的日期時間字段,我需要確保我的映射和模型反映的事實,它可以爲空(否則NHibernate拋出一個關於無效日期時間值的錯誤) – 2009-11-20 11:47:49

+0

但該可空的日期是在產品(不是類別)對不對? – dotjoe 2009-11-20 14:23:43

+0

+1我又回來了。 :) – Dusty 2009-12-07 19:38:40

0

使用NH的EnumStringType<T>將您的類別作爲枚舉映射到相應的數據庫值(可以是字符串或數字)。你會發現不少使用例子,如果你是谷歌的。

HTH!

4

看起來你可能能夠使用Session.Load(id)功能。

Session.Load是一個特殊的方法,它返回帶有ID的代理,直到您請求加載它的另一個屬性。如果沒有與ID匹配的項目,則會引發錯誤。嘗試是這樣的:

product.Category = Session.Load<Category>(2); //2 being the new category ID 

Session.SaveOrUpdate(product); 

我只是做了一個小測試,它似乎並沒有給拉了回來,整個類別。

+0

現在我不知道該做哪種方式...我使用當我更新現有實體負荷,但也應該爲每個參考使用Load? hmmm – dotjoe 2009-11-20 15:46:03

+1

NHibernate中的一個很好的規則是使Identity列的setter變爲private或protected。這不會允許您像在答案中那樣分配ID。查看SharpArchitecture以獲得良好的實施,以及如何在測試中修改Id。 如前所述,除非需要屬性,否則Session.Load不會對數據庫執行任何操作,所以我們基本上只是在做出與您的答案相同的事情,而只需要一個能夠在需要時自行解析的智能對象。 – 2009-11-20 18:44:21

+0

優秀點 – dotjoe 2009-11-23 14:32:00