#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 не может этого знать.