Отображение вложенных коллекций с помощью Automapper

#c# #asp.net-core #entity-framework-core #automapper #nested-object

#c# #asp.net-ядро #сущность-фреймворк-ядро #automapper #вложенный объект #asp.net-core #entity-framework-core

Вопрос:

Я пытался сопоставить свои объекты с моими viewmodels с помощью AutoMapper. И столкнулся с проблемами с отображением вложенной коллекции.

Источник

 public class Consignment
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<ConsignmentLine> ConsignmentLines { get; set; }
    public ICollection<ConsignmentDocument> ConsignmentDocuments { get; set; }
}

public class ConsignmentLine
{
    public Guid Id { get; set; }
    public Guid ConsignmentId { get; set; }
    public ICollection<ConsignmentDocument> ConsignmentDocuments { get; set; }
}

public class ConsignmentDocument
{
    public Guid Id { get; set; }
    public Guid ConsignmentId { get; set; }
    public Guid ConsignmentLineId { get; set; }
    public string DocumentName { get; set; }
}

public class ConsignmentLineViewModel
{
    public Guid Id { get; set; }
    public Guid ConsignmentId { get; set; }
    public ICollection<ConsignmentDocumentViewModel> ConsignmentDocuments { get; set; }
}
 
public class ConsignmentDocumentViewModel
{
    public Guid Id { get; set; }
    public Guid ConsignmentId { get; set; }
    public Guid ConsignmentLineId { get; set; }
    public string DocumentName { get; set; }
}
  

Пункт назначения

 public class ConsignmentDetailsViewModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<ConsignmentLineViewModel> ConsignmentLines { get; set; }
    public ICollection<ConsignmentDocumentViewModel> ConsignmentDocuments { get; set; }
}
  

Я могу очень легко сопоставить consignmentDocuments для каждой партии, но при сопоставлении строк отправки для каждой партии я получаю «Исключение AutoMapper». Я знаю, что исключение генерируется из-за того, что каждая строка отправки имеет свою собственную коллекцию документов отправки.

Прямо сейчас мой профиль automapper

 CreateMap<Consignment, ConsignmentDetailsViewModel>()
            .ForMember(vm => vm.consignmentLineViewModel, opt => opt.MapFrom(model => model.ConsignmentLine.ToList()))
            .ForMember(vm => vm.consignmentDocumentViews, opt => opt.MapFrom(model => model.ConsignmentDocument.ToList()));
  

Как я могу сопоставить их все с классом ConsignmentViewModel?

Комментарии:

1. Можете ли вы показать нам исключение, которое вы получаете, также вы не включили модели просмотра для строк отправки и документов отправки.

2. @Muhammad это исключение, которое я получаю «Exception throwned: ‘AutoMapper. Исключение AutoMapperMappingException’ в AutoMapper.dll »

3. также я добавил consignmentLineViewModel и ConsignmentDocumentViewModel

4. Также можете ли вы опубликовать код, который вы пытаетесь отобразить из источника в пункт назначения

Ответ №1:

Решена проблема.

Решение состоит в том, чтобы создать карту для ConsignmentLine, чтобы получить коллекцию ConsignmentDocuments.

 CreateMap<Consignment, ConsignmentDetailsViewModel>()
        .ForMember(vm => vm.consignmentLineViewModel, opt => opt.MapFrom(model => model.ConsignmentLine))
        .ForMember(vm => vm.consignmentDocumentViews, opt => opt.MapFrom(model => model.ConsignmentDocument));

CreateMap<ConsignmentLine, ConsignmentLineViewModel>()
            .ForMember(vm => vm.consignmentDocumentViews, opt => opt.MapFrom(model => model.ConsignmentDocument));
  

Комментарии:

1. Вам не нужно ToList .

Ответ №2:

Если вы действуете просто, не задумываясь о слишком сложных транзакциях AutoMapper, вы можете выполнять все свои транзакции.

Пример:

  CreateMap<Consignment, ConsignmentDetailsViewModel>();
 CreateMap<ConsignmentLine, ConsignmentLineViewModel>();
 CreateMap<ConsignmentDocument, ConsignmentDocumentViewModel>();