Как сопоставить DTO в сложных вложенных отображениях

#c# #automapper #dto

#c# #automapper #dto

Вопрос:

Как сопоставить массив свойств объекта с массивом объекта сложного типа с помощью automapper

У меня есть структура классов следующим образом:

 public class Product : Entity, IAggregateRoot
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual List<ProductPicture> ProductPictures { get; set; }
    public virtual List<ProductSpecification> Specifications { get; set; }
}

public class ProductSpecification : Entity
{
    public Guid ProductId { get; set; }
    public Guid SpecificationId { get; set; }

    public virtual Product Product { get; set; }
    public virtual Specification Specification { get; set; }
    public virtual List<ProductSpecificationData> Data { get; set; }
}

public class ProductSpecificationData : Entity
{
    public Guid Id { get; set; }
    public Guid ProductSpecificationId { get; set; }
    public string Value { get; set; }

    public virtual ProductSpecification ProductSpecification { get; set; }
}

public class Specification: Entity, IAggregateRoot
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual List<ProductSpecification> ProductSpecifications { get; set; }
}
  

Я хочу сопоставить Product с ProductDetailDTO

 public class ProductDetailDTO
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public class ProductSpecification
    {
        public string Name { get; set; } //from specification
        public string Description { get; set; }  //from specification

        public class ProductSpecificationData
        {
            public string Value { get; set; }
        }
        public List<ProductSpecificationData> Data { get; set; } //from ProductSpecificationData 
    }

    public List<ProductSpecification> Specifications { get; set; }
 }
  

Я всегда получаю данные в ProductDetailDTO-> ProductSpecification-> Данные равны нулю.

Я пытался сделать что-то вроде этого:

 mc.CreateMap<Product, ProductDetailDTO>().ForMember(dest => dest.PictureUris, mo => { mo.MapFrom(src => src.ProductPictures.Select(pp => pp.PictureUri)); })
                                         .ForMember(dest => dest.Specifications, mo => { mo.MapFrom(src => src.Specifications.Select(s => s.Specification)); });
    
mc.CreateMap<Specification, ProductDetailDTO.ProductSpecification>();
mc.CreateMap<ProductSpecificationData, ProductDetailDTO.ProductSpecification.ProductSpecificationData>();
  

код для вызова Map:

 Product Product = new Product
{
    Name = "test product",
    Description = "test product description",
    ProductPictures = new List<ProductPicture>
    {
        new ProductPicture { PictureUri = "test uri 1" },
        new ProductPicture { PictureUri = "test uri 2" }
    },
    Specifications = new List<ProductSpecification>
    {
        new ProductSpecification {
            Specification = new Specification
            {
                Name = "test specification 1",
                Description = "test specification description 1",
            },
            Data = new List<ProductSpecificationData>
            {
                new ProductSpecificationData
                {
                    Data1 = "test data1",
                    Data2 = "test data2",
                }
            }
        },
    }
};

ProductDetailDTO productDetail = mapper.Map<ProductDetailDTO>(Product);
  

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

1. Покажите код для Map вызова.

2. Я добавил код к вопросу

3. Specification => ProductDetailDTO.ProductSpecification . Откуда Data должно исходить? См. docs.automapper.org/en/latest/Configuration-validation.html .

4. Продукт => Спецификации [индекс] => Данные. Таким образом, необходимо получать данные из каждого элемента массива спецификаций

5. Это код, который вы должны написать, AM не может этого знать.