Проблема с отображением объектов с помощью автомпера - PullRequest
1 голос
/ 25 марта 2020

У меня проблема с отображением. Вот моя модель .

    public class Post
    {
        public int Id { get; set; }
        public string Description { get; set; }
        public DateTime Created { get; set; }
        public User User { get; set; }
        public int UserId { get; set; }
    }

Мой Dto:

public class PostForReturnDto
    {
        public PostForReturnDto()
        {
             Created = DateTime.Now;
        }
         public int Id { get; set; }
        public string Description { get; set; }
        public DateTime Created { get; set; }
        public string Author { get; set; }
    }

AutoMapperProfiles.cs

 CreateMap<Post, PostForReturnDto>()
            .ForMember(p => p.Author,
             opt => opt.MapFrom(src => src.User.KnownAs));

RepositoryContext

 public async Task<IEnumerable<Post>> GetPosts() {
             var posts = _context.Posts
            .Include(u => u.User)
            .OrderByDescending(p => p.Created)
            .ToListAsync();

            return await posts;
        }

В режиме отладки в PostController я получаю следующую информацию с пользовательским объектом внутри.

enter image description here enter image description here

Я пытаюсь сопоставить свойство KnownAs объекта User с моим DTO, но безуспешно. Ошибка:

AutoMapper.AutoMapperMappingException: отсутствует конфигурация карты типов или не поддерживается отображение. Типы сопоставления: список 1 -> PostForReturnDto System.Collections.Generic.List 1 [[DateApp.API.Models.Post, DateApp.API, версия = 1.0.0.0, культура = нейтральный, PublicKeyToken = null]] -> DateApp.API.Dtos.PostForReturnDto в lambda_method (закрытие , List`1, PostForReturnDto, ResolutionContext) в lambda_method (закрытие, объект, объект, ResolutionContext) в AutoMapper.Mapper.Map [TDestination] (источник объекта) в C: \ projects \ automapper \ src \ AutoMapper \ Mapper.cs : строка 35

1 Ответ

2 голосов
/ 25 марта 2020

Кажется, что вы отображаете List<Post>, а не Post экземпляр, как это должно быть

, попробуйте, как показано ниже

var posts = await _repo.GetPosts();

var res = posts.Select(_ => _mapper.Map<PostToReturn>(_));

return Ok(res);

, или вы можете отобразить коллекцию, используя generi c аргумент как документация говорит

IEnumerable<PostToReturn> postToReturn= mapper.Map<IEnumerable<Post>, IEnumerable<PostToReturn>>(posts);

UPD Кажется, что в вашей GetPosts() реализации отсутствует какой-либо фильтр Where или Take. Он забирает все сообщения прямо сейчас и может вызвать проблемы с производительностью при большом количестве сообщений.

...