Automapper выдает System.ArgumentException
Я обновил AutoMapper до его версии 2, и теперь у меня много проблем с ним...
У меня есть список ItemToMap
и все эти объекты имеют ссылку на один и тот же объект Tag
Когда я пытаюсь нанести на карту ItemToMap
с ItemToMapDto
Я получил эту ошибку:
AutoMapper.AutoMapperMappingException:
Типы отображения: Tag -> TagDto DAL.Entities.Tag -> DTO.Objects.TagDto
Путь назначения: ItemToMap[][1].Tag.Tag
Исходное значение: Entities.Tag ----> System.ArgumentException: элемент с тем же ключом уже добавлен.
Вот карта:
Mapper.CreateMap<ItemToMap, ItemToMapDto>();
Mapper.CreateMap<Tag, TagDto>();
Вот тестовый модуль, который выдвигает на первый план мою проблему:
var temp = new List<ItemToMap>();
var tag1 = this.RandomTag;
var length = 10;
for (int i = 0; i < length; i++)
{
temp.Add(new ItemToMap()
{
Tag = tag1,
});
}
var record = temp.ToArray();
var mapped = Mapper.Map<ItemToMap[], ItemToMapDto[]>(record);
Каково решение, чтобы мои карты работали? Я ищу глобальное решение, потому что проблема распространяется по всему коду...
РЕДАКТИРОВАТЬ 1:
Проблема исходит от ctor ниже, если я прокомментирую код ctor, все работает нормально...
public class ItemToMapDto
{
public ItemToMapDto()
{
/* If I comment the line below, all's fine... But it not the behaviour
* I want, I'd like to have a default value for the property...
*/
this.Tag = new TagDto() { Name = this.RandomText };
}
public string Name
{
get;
set;
}
public TagDto Tag
{
get;
set;
}
}
РЕДАКТИРОВАТЬ 2:
Automapper кеширует ResolutionContext
повторно использовать уже установленные резольверы. Другими словами, он проходит через мапперы и принимает тот, который возвращает true по вызову IsMatch
, Чтобы узнать, является ли это ResolutionContext
кэшируется, он проверяет, установлено ли уже свойство назначения и хэш-код контекста. Поскольку место назначения установлено в Ctor, Automapper считает, что это не кешируется, и поэтому вызывает некэшированный распознаватель. Последний распознаватель будет кешироваться, но не получится, потому что хэш-код уже существует в Dictionary
используется в качестве кеш-хранилища
2 ответа
Вы должны зарегистрироваться DAL.Entities.Tag
а также DTO.Objects.TagDto
хотя у вас есть одинаковые имена свойств на Tag и TagDto
Я думаю, некоторые из свойств в Tag
класс ты не картируешь. Если так, то используйте Ignore
Mapper.CreateMap<Tag, TagDto>().ForMember(x => x.value, opt => opt.Ignore());