Как я сохраняю временный объект, который уже существует на сессии NHibernate?

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

6
задан Daniel T. 24 April 2010 в 07:42
поделиться

3 ответа

Вместо попытки объединить временный экземпляр. Почему бы не начать с фактического экземпляра ... просто получите продукт по идентификатору, обновите поля и выполните фиксацию.

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();
8
ответ дан 10 December 2019 в 00:35
поделиться

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

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

3
ответ дан 10 December 2019 в 00:35
поделиться

Возможно, вам стоит вызвать Database.SaveOrUpdate (store); вместо чистого Save (store)?

-1
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: