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 ответа

Решение

Это ошибка. Исправление будет в версии 2.2.1

Вы должны зарегистрироваться DAL.Entities.Tag а также DTO.Objects.TagDto хотя у вас есть одинаковые имена свойств на Tag и TagDto

Я думаю, некоторые из свойств в Tag класс ты не картируешь. Если так, то используйте Ignore

Mapper.CreateMap<Tag, TagDto>().ForMember(x => x.value, opt => opt.Ignore());

Посмотрите здесь и здесь и здесь

Другие вопросы по тегам