#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>();