Как сохранить временный объект, который уже существует в сеансе NHibernate? - PullRequest
6 голосов
/ 24 апреля 2010

У меня есть 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 уже содержит объект с тем же идентификатором.Как мне обойти эту проблему?

Ответы [ 3 ]

8 голосов
/ 25 апреля 2010

Вместо того, чтобы пытаться объединить временный экземпляр. Почему бы не начать с фактического экземпляра ... просто получите продукт по 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();
3 голосов
/ 24 апреля 2010

Я не уверен на 100% в этом случае без дополнительного контекста, но слияние сеанса может работать

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

0 голосов
/ 24 апреля 2010

Возможно, вам следует вызвать Database.SaveOrUpdate (store); вместо чистого сохранения (магазина)?

...