автоматическое отображение отношений «многие ко многим» - PullRequest
0 голосов
/ 17 мая 2018

Допустим, на странице BookDetails (BookForDetailsDto) мы также показываем авторов этой книги (AuthorForListingDto).И более того, я хочу показать этот список авторов вместе с небольшой информацией (только имя и идентификатор) о книгах (BookForAuthorListingDto) каждого автора.

У меня есть простое отношение «многие ко многим», состоящее изОбъекты Book, Author и BookAuthor.

public class Book {        
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BookAuthor> Authors { get; set; }
}

public class Author {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BookAuthor> Books { get; set; }
}

public class BookAuthor {
    public int BookId { get; set; }
    public Book Book { get; set; }
    public int AuthorId { get; set; }
    public Author Author { get; set; }
}

И у меня также есть 3 DTO (где я останавливаю бесконечный цикл):

public class BookForDetailsDto {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<AuthorForListingDto> Authors { get; set; }
}

public class AuthorForListingDto {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BookForAuthorListingDto> Books { get; set; }
}

public class BookForAuthorListingDto {
    public int Id { get; set; }
    public string Name { get; set; }
}

Имею следующую конфигурацию:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Book, BookForDetailsDto>();
    cfg.CreateMap<BookAuthor, AuthorForListingDto>();
    cfg.CreateMap<AuthorForListingDto, BookForAuthorListingDto>();
});

Я бы хотел выполнить отображение из Book в BookForDetailsD, например, так.

BookForDetailsDto BookDto = mapper.Map<BookForDetailsDto>(book);

Но в результате я получаю исключение System.NullReferenceException.Кажется, что только на первом уровне отображения AutoMapper не может получить информацию об авторе из объекта BookAuthor.Я ищу вариант конфигурации, но безуспешно.Я должен сказать, что я новичок в autopper, и если есть простое решение, которое я ценю.

Примечание: я увидел комментарий, который звучит так: «Не рекомендуется ссылаться в одном DTO на второй DTO.».Но я не могу понять, как поступить иначе, потому что, например, для clickable / navigatable child_object нам нужен как минимум «ключ и display_name», поэтому дочерний объект типа List кажется неизбежным.

1 Ответ

0 голосов
/ 17 мая 2018

Новый день с новой головой ... Я изменил сопоставления, как показано ниже, и все работает как положено:

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Book, BookForDetailsDto>()
                .ForMember(dto => dto.Authorss, opt => opt.MapFrom(x => x.Authors.Select(a => a.Author)));
            cfg.CreateMap<BookAuthor, BookForAuthorListingDto >()
                .ForMember(res => res.Id, opt => opt.MapFrom(dto => dto.Book.Id))
                .ForMember(res => res.Name, opt => opt.MapFrom(dto => dto.Book.Name));
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...