6

我有一個Store包含的Products列表:如何保存一個已存在於NHibernate會話中的瞬態對象?

var store = new Store(); 
store.Products.Add(new Product{ Id = 1, Name = "Apples" }; 
store.Products.Add(new Product{ Id = 2, Name = "Oranges" }; 

Database.Save(store); 

現在,我想編輯的Products之一,但有短暫的實體。這將是,例如,從網絡瀏覽器數據:

// this is what I get from the web browser, this product should 
// edit the one that's already in the database that has the same Id 
var product = new Product{ Id = 2, Name = "Mandarin Oranges" }; 

store.Products.Add(product); 
Database.Save(store); 

然而,試圖做這種方式給我一個錯誤:

a different object with the same identifier value was already associated with the session

原因是因爲store.Products集合已經包含具有相同Id的實體。我如何解決這個問題?

+0

你有保存第二次受審session.Evict(產品)? – mxmissile 2010-04-24 08:24:02

回答

8

,而不是試圖合併瞬態的實例。爲什麼不從實際的實例開始......只需通過id獲取產品,更新字段並提交。

var product = session.Get<Product>(2); 
product.Name = "Mandarin Oranges"; 
tx.Commit(); 

或合併的方式...

var product = new Product{ Id = 2, Name = "Mandarin Oranges" }; 
var mergedProduct = (Product) session.Merge(product); 
tx.Commit(); 
-1

也許你應該調用Database.SaveOrUpdate(store);而不是純粹的保存(存儲)?

+0

哎呀,忘了提及'Database.Save()'在後臺執行'NHibernate.ISession.SaveOrUpdate()'。 – 2010-04-24 21:02:20

+0

SaveOrUpdate在這種情況下不起作用,因爲會話中已經存在對象,所以發生錯誤。 – jfneis 2010-04-26 02:00:54

相關問題