如何保存一个已存在于NHibernate会话中的瞬态对象?

如何保存一个已存在于NHibernate会话中的瞬态对象?

问题描述:

我有一个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

,而不是试图合并瞬态的实例。为什么不从实际的实例开始......只需通过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(); 

也许你应该调用Database.SaveOrUpdate(store);而不是纯粹的保存(存储)?

+0

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

+0

SaveOrUpdate在这种情况下不起作用,因为会话中已经存在对象,所以发生错误。 – jfneis 2010-04-26 02:00:54

在这种情况下,如果没有更多上下文,我并不是100%肯定的,但会话合并可能会起作用。

http://ayende.com/Blog/archive/2009/11/08/nhibernate-ndash-cross-session-operations.aspx

+0

感谢您的链接,解释为何出现此问题。 – 2012-04-20 14:35:23