2008-10-30 82 views
0

我有一個用戶對象,它上面有一個Country對象。我在用戶映射文件中使用多對一標籤來映射:更新多對一的關係

<many-to-one name="Country" column="CountryID" cascade="none"/> 

如何更新用戶的國家?

目前我的用戶界面有一個國家的下拉列表和新國家的ID傳遞給控制器​​。控制器然後從該值中設置用戶國家的ID。所以:

var user = session.Get<User>(userID); 
user.Country.ID = Convert.ToInt32(Request.Form["Country_ID"]); 

但是,當我打電話:

session.SaveOrUpdate(user); 

我得到一個錯誤,指出「國家的一個實例的標識由7改爲8」。據推測這是因爲Country對象被NHibernate標記爲髒?我不想更新國家對象,只是用戶的ID參考。這樣做有可能嗎?

感謝, 喬恩

回答

0
var user = session.Get<User>(userID); 
user.Country = session.Get<Country>(Convert.ToInt32(Request.Form["Country_ID"])); 

必須從數據庫中檢索的國家,然後將其設置爲用戶

0

感謝安德斯。爲什麼我們需要額外的開銷來獲取對象:當我們正在做的是更新對該對象的引用時?

實際上,我們的控制器會自動反序列化對對象的請求。有沒有辦法可以告訴NHibernate忽略國家對象的更新並更新用戶?我會認爲級聯=「無」會做到這一點。

如果您需要更新的對象上有多個多對一對象,會發生什麼情況?在保存之前將它們全部退回,這是很多開銷。

+0

其實你不一定需要nhibernate來檢索數據。 ISession的Load和Get之間有一個小的區別。其中一人懶洋洋地工作,另一人立即檢索。 – Min 2008-11-06 18:44:12

0

那真的會否定首先使用ORM的整個目的,是不是?更新這樣的子對象的正常模式是什麼?當然這是一個非常普遍的情況。它是加載每一個高達:

var user = session.Get<User>(userID); 
user.Country = session.Get<Country>(Convert.ToInt32(Request.Form["Country_ID"])); 
user.Manager = session.Get<User>(Convert.ToInt32(Request.Form["Manager_ID"])); 
user.State = session.Get<State>(Convert.ToInt32(Request.Form["State _ID"])); 
user.Region = session.Get<Region>(Convert.ToInt32(Request.Form["State _ID"])); 

我們真的需要作出額外的數據庫調用每一個子對象(事件雖然不被更新的對象)?

目前,我們有:

var ds = new NameValueDeserializer(); 
var entity = session.Get<TEntity>(entityID); 
ds.Deserialize(entity, form); 
session.Update(entity); 

所以這個工程一般爲所有實體。不得不專門加載子對象來保存實體將是一種不必要的編碼開銷(以及額外的數據庫調用)。

在配置,映射,攔截器等方面沒有辦法解決這個問題嗎?有誰知道爲什麼Hibernate採取了這個設計決策?