如何保存一个已存在于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的实体。我如何解决这个问题?
,而不是试图合并瞬态的实例。为什么不从实际的实例开始......只需通过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);而不是纯粹的保存(存储)?
哎呀,忘了提及'Database.Save()'在后台执行'NHibernate.ISession.SaveOrUpdate()'。 – 2010-04-24 21:02:20
SaveOrUpdate在这种情况下不起作用,因为会话中已经存在对象,所以发生错误。 – jfneis 2010-04-26 02:00:54
在这种情况下,如果没有更多上下文,我并不是100%肯定的,但会话合并可能会起作用。
http://ayende.com/Blog/archive/2009/11/08/nhibernate-ndash-cross-session-operations.aspx
感谢您的链接,解释为何出现此问题。 – 2012-04-20 14:35:23
你有保存第二次受审session.Evict(产品)? – mxmissile 2010-04-24 08:24:02