Задать вопрос
Lixoradka
@Lixoradka
.Net разработчик

Почему Automapper не мапит коллекции объектов EF в коллекции контейнеров?

Модель базы данных включает в себя 3 таблицы: Пользователи, Медиа материалы, Типы пользователей.
Соответственно сущность пользователь ссылается на две другие таблицы, образуя связи через Navigation Property.

В своей проекте я использую Automapper следующим образом:
1. Создал класс CommonMapper, который в конструкторе регистрирует все карты. К примеру вот так
Mapper.CreateMap<MediaEntity, MediaContainer>()
Mapper.CreateMap<MediaContainer, MediaEntity>();
Mapper.CreateMap<IEnumerable<MediaContainer>, IEnumerable<MediaEntity>>();
Mapper.CreateMap<IEnumerable<MediaEntity>, IEnumerable<MediaContainer>>();

2. Далее в нем есть метод. Вот его код
public DestinationType Map<SourceType, DestinationType> (SourceType source)
        {
            return Mapper.Map<SourceType, DestinationType>(source);
        }

3. В коде использую к примеру вот так.
UsersContainer test = _mapper.Map<UsersEntity, UsersContainer>(entity);

Проблема в том, что один объект из EF спокойно мапится в DTO контейнер, однако если объекты в коллекции, от используя
_mapper.Map<IEnumerable<UsersEntity>,IEnumerable<UsersContainer>>(entities);

или даже так
_mapper.Map<UsersEntity,UsersContainer>(entities);

всегда получаю одно и то же исключение. Вот внешнее:
Mapping types:
IEnumerable`1 -> IEnumerable`1
System.Collections.Generic.IEnumerable`1[[InstaBot.DAL.Entities.UsersEntity, InstaBot.DAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.IEnumerable`1[[InstaBot.DTO.Containers.UsersContainer, InstaBot.DTO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Destination path:
IEnumerable`1

Source value:
System.Collections.Generic.List`1[InstaBot.DAL.Entities.UsersEntity]


А вот InnerException:
Отсутствует реализация метода "GetEnumerator" в типе "Proxy<System.Collections.Generic.IEnumerable`1[[InstaBot.DTO.Containers.UsersContainer_InstaBot.DTO_Version=1.0.0.0_Culture=neutral_PublicKeyToken=null]]_mscorlib_Version=4.0.0.0_Culture=neutral_PublicKeyToken=b77a5c561934e089>" из сборки "AutoMapper.Proxies, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005".


Пробовал уже и карту по-другому создавать. К примеру вот так:
Mapper.CreateMap<UsersEntity, UsersContainer>()
                .ForMember(dto => dto.UserTypes, opt => opt.MapFrom(x => x.UserTypes))
                .ForMember(dto => dto.Media, opt=>opt.MapFrom(x=>x.Media));


Однако это ничего не дало. Самое интересно то, что объект в контейнер мапится без проблем, а вот коллекция объектов в коллекцию контейнеров никак. Помогите пожалуйста справиться в этой проблемой. Уже какой день не могу ничего понять.

P.S.: не уверен, что проблема из-за Navigation Property, просто на всякий случай уточнил. Наверное все таки неправильно использую автомаппер. Но маппить в цикле по одной сущности, когда их от 1к до 50к это совсем не выход...
  • Вопрос задан
  • 3564 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@mayorovp
Mapper.CreateMap<IEnumerable<MediaContainer>, IEnumerable<MediaEntity>>();
Mapper.CreateMap<IEnumerable<MediaEntity>, IEnumerable<MediaContainer>>();
Для начала уберите эти строки. Automapper сам разберется, что ему делать с перечислениями.
Ответ написан
Комментировать
@Rayvor
Mapper.Initialize(cfg => cfg.CreateMap<UsersEntity, UsersContainer>));

var users = _mapper.Map<IEnumerable<UsersContainer>, List<UsersEntity>>(entities);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы