2014-12-19 2 views
0

У меня есть класс Employee с адресами, как свойство в нем, как показано ниже, и EmployeeDTO и AddressDTONHibernate бросает NonUniqueObjectException, когда ребенок коллекции отображается через automapper

public class EmployeeDTO { 
    public string Name { get; set; } 
    public IList<AddressDTO> Addresses { get; set; } 
} 

public class Employee { 
    public virtual string Name { get; set; } 
    public virtual IList<Address> Addresses { get; set; } 
} 

соответствующего DTO в Мои AutoMapper Отображения немного больше, чем это, но ради простоты я просто показываю прямое отображение.

Mapper.CreateMap<EmployeeDTO, Employee>(); 
Mapper.CreateMap<Employee, EmployeeDTO>(); 

Mapper.CreateMap<AddressDTO, Address>(); 
Mapper.CreateMap<Address, AddressDTO>(); 

В моей datalayer я получаю Работника по его имени, а затем преобразовать его в EmployeeDTO и передать его в пользовательский интерфейс. В пользовательском интерфейсе я меняю адрес или добавляю новый адрес в Адреса EmployeeDTO и переношу его обратно на сервер, чтобы он сохранялся. В репозитории я получаю существующего сотрудника из базы данных, а затем использую AutoMapper для обновления объекта. Я использую перегрузки Карты AutoMapper, чтобы дать один и тот же объект назад

TDestination Map<TSource, TDestination>(TSource source, TDestination destination); 
var empObj = Mapper.Map<EmployeeDTO, Employee>(updatedDTO, empInDb); 

Я использую SaveOrUpdate сессии, чтобы упорствовать

_session.SaveOrUpdate(empObj); 

на совершение этого бросает исключение поговорки

«другой объект с то же значение идентификатора уже было связано с сеансом: 4, лица: Адрес «

Если я использую _session.Merge, он работает нормально, но ранее, когда я использовал ручное сопоставление вместо AutoMapper, он отлично работал с 'session.SaveOrUpdate.'

  1. Итак, что происходит, когда я сопоставляю с помощью AutoMapper. Я думаю, что внутри automapper, когда он видит сопоставление между списком и списком, он просто использует обычную карту. мы можем указать где-нибудь, чтобы AutoMapper использовал перегрузку Map так, чтобы он возвращал один и тот же объект.
  2. Я видел небольшую разницу в скорости между SaveOrUpdate и Merge. В любом случае, чтобы ускорить его.
+0

Возможный без ответа дубликат [Сопоставление детских коллекций с использованием AutoMapper] (http://stackoverflow.com/questions/20253074/mapping-child-collections-using-automapper) –

ответ

0

Сложное обратное отображение с помощью AutoMapper не поддерживается. Сопоставление коллекций сложно. Вам нужно будет объединить две коллекции, удалить то, чего не существует, добавить новые вещи и т. Д. Вам также необходимо определить какой-то механизм того, как сопоставить существующий исходный DTO с целевой моделью.

Если вы написали обратный код вручную, вы увидите, с чем вы столкнулись. Не перестраивайте сложные комплексные объекты, они не поддерживаются и, вероятно, никогда не будут.

+0

Для понимания я упростил приведенный выше код. В моем фактическом коде я указал, как сопоставить каждое свойство от DTO до BO, а также от BO до DTO (отдельно). AutoMapper отлично отображает объекты. Я получаю ошибку только от части NHibernate. –

Смежные вопросы