NHibernate и AutoMapper не играют хорошо: «другой объект с таким же значением идентификатора уже был» - PullRequest
4 голосов
/ 22 февраля 2011

Получение этой ошибки: другой объект с тем же значением идентификатора уже был связан с сеансом: 27, объекта: xxx.Core.Event

По сути, у меня есть модели представления, которые отображаются из моегопоко и наоборот.Оскорбительный код здесь:

Mapper.CreateMap<EventsAddEditViewModel, Event>();
        Event thisEvent = _eventRepository.GetById(viewModel.Id);
        thisEvent = Mapper.Map<EventsAddEditViewModel, Event>(viewModel);
        thisEvent.EventType = new EventType { Id = viewModel.EventTypeId };
        ValidationResult result = _eventService.Save(thisEvent);

В основном я загружаю событие из базы данных, а затем сопоставляю модель представления этому событию и сохраняю.В противном случае есть поля, которые не отображаются в представлении (например, dateCreated), которые не будут сохранены должным образом.

Есть ли способ, которым NHibernate и AutoMapper могут хорошо играть в этом отношении?

Я использую OnePerRequestBehavior для своего поставщика сеансов.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

Верните NHibernate тот же объект обратно при сохранении.

Для этого мы используем другую перегрузку Mapper.Map(). Кроме того, когда компилятор может определить типы, нет необходимости указывать их.

Также GetById() может возвращать ноль.

Mapper.CreateMap<EventsAddEditViewModel, Event>();

Event thisEvent = _eventRepository.GetById( viewModel.Id );
if (thisEvent == null) {
    thisEvent = new Event();
}

Mapper.Map( viewModel, thisEvent );

thisEvent.EventType = new EventType { Id = viewModel.EventTypeId };
ValidationResult result = _eventService.Save( thisEvent );
0 голосов
/ 22 февраля 2011

Причина в том, что объект не тот, который вы действительно получили от NHibernate.

Либо используйте этот объект, либо, если ваш реальный код отличается от описанного выше, тогда есть другой подход ...

В своем коде NHibernate вы пытались использовать session.Merge () или session.SaveOrUpdateCopy () или около того вместо session.Save () или session.Update ()?

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