У меня есть a 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
набор уже содержит объект с тем же идентификатором. Как я обхожу эту проблему?
Вместо попытки объединить временный экземпляр. Почему бы не начать с фактического экземпляра ... просто получите продукт по идентификатору, обновите поля и выполните фиксацию.
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();
Я не уверен на 100% в этом случае без дополнительного контекста, но слияние сеансов может сработать.
http://ayende.com/Blog/archive/2009/11/08/nhibernate-ndash-cross-session-operations.aspx
Возможно, вам стоит вызвать Database.SaveOrUpdate (store); вместо чистого Save (store)?