Сохранение объекта NHibernate после автоматического сопоставления его с DTO - PullRequest
0 голосов
/ 27 июля 2010

Мы пытаемся использовать NHibernate 1.1 в качестве постоянного слоя за API веб-службы. Ничего нового там нет. Мы используем Automapper для перевода доменных объектов, которые мы получаем из (Fluent-) NHibernate, в DTO, которые мы отправляем по проводам.

Проблема, которую мы видим, заключается в следующем сценарии:

  1. Читаем объект из репозитория
  2. Мы переводим этот объект (через Automapper) в форму DTO.
  3. После некоторого, возможно, тривиального перепутывания, объект отображается обратно из DTO в объект Fluent-Nhibernate (включая первичный ключ, который не может измениться).
  4. Мы сохраняем объект.

После шага 4 мы получаем Nonuniqueobjectexception от NHibernate, и он создает новую строку для сохранения объекта (с новым первичным ключом). Мы хотим обновить исходную строку, но вместо этого новые строки изменяются (!)

Итак, в этой ситуации, как мы можем убедить NHibernate выполнить обновление вместо операции вставки?

Кстати, если мы пропустим перевод в DTO и обратно, с обновлением проблем не будет.

== Тевя ==

Ответы [ 3 ]

0 голосов
/ 27 июля 2010

Вы можете попытаться объединить объект в своем сеансе.

// Assuming you already have a session open
// and you've already mapped your DTO back
using (var tx = session.BeginTransaction())
{
    var nhibernateObject = (YourNhibernateObjectType)session.Merge(mappedBackFromDTO);

    tx.Commit();
}
0 голосов
/ 09 марта 2011

Вы должны прикрепить ваш (новый) объект после сопоставления из DTO с текущей ISession.Присоединение - это операция, выполняемая методом ISession.Update.

0 голосов
/ 27 июля 2010

1) NHibernate 1.1 или Fluent NHib 1.1?
2) Я думаю, что у вас есть проблема с управлением сессиями.Если вы загрузите один объект в session1 и попытаетесь сохранить его, не подключая фактический объект к session2, вы получите новую строку в БД.Попробуйте прочитать и обновить объект в течение одного сеанса и увидеть результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...