Допустим, на странице 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 кажется неизбежным.