我的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的实体。我该如何解决这个问题?
答案 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);而不是纯粹的保存(商店)?