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

时间:2010-04-24 07:42:09

标签: c# nhibernate persistence session-state castle-activerecord

我的Store包含Products的列表:

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);

但是,尝试这样做会给我一个错误:

  

具有相同标识符值的其他对象已与会话

关联

原因是store.Products集合已包含具有相同Id的实体。我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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 :(得分:3)

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

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

答案 2 :(得分:-1)

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