У меня есть класс 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.'
- Итак, что происходит, когда я сопоставляю с помощью AutoMapper. Я думаю, что внутри automapper, когда он видит сопоставление между списком и списком, он просто использует обычную карту. мы можем указать где-нибудь, чтобы AutoMapper использовал перегрузку Map так, чтобы он возвращал один и тот же объект.
- Я видел небольшую разницу в скорости между SaveOrUpdate и Merge. В любом случае, чтобы ускорить его.
Возможный без ответа дубликат [Сопоставление детских коллекций с использованием AutoMapper] (http://stackoverflow.com/questions/20253074/mapping-child-collections-using-automapper) –