sziszu
sziszu

Reputation: 320

Mapping to nested value Automapper

I'm struggling to map 2 objects. Basically have Product which is my EF model, and I'm mapping this to ProductDto, which has FileDto.

I'd like to map Product.FileName to ProductDto.File.Internal name, how to do this? Classes below.

public class Product : BaseEntity<long>
  {
    [MaxLength(100)]
    public string Name { get; set; }
    [MaxLength(100)]
    public string Barcode { get; set; }
    public int ShelfLife { get; set; }
    public int Weight { get; set; }
    public bool HasAllergens { get; set; }
    [MaxLength(100)]
    public string FileName { get; set; }
    [ForeignKey("Id")]
    public int CustomerId { get; set; }
    public virtual ICollection<ProductIngredient> ProductIngredient { get; set; }
    public virtual ICollection<Nutrition> Nutritions { get; set; }
    public virtual ICollection<ProductComposition> Composition { get; set; }
    public virtual IList<ProductionProcess> ProductionProcess { get; set; }
  }

  public class ProductDto
  {
    public long Id { get; set; }
    public DateTime CretedOn { get; set; }
    public DateTime UpdatedOn { get; set; }
    public string Name { get; set; }
    public string Barcode { get; set; }
    public int ShelfLife { get; set; }
    public int Weight { get; set; }
    public bool HasAllergens { get; set; }
    public int CustomerId { get; set; }
    public FileDto File { get; set; }
    public IList<IngredientDto> Ingredients { get; set; }
    public IList<NutritionDto> Nutritions { get; set; }
    public IList<ProductCompositionDto> Composition { get; set; }
    public IList<ProductionProcessDto> ProductionProcess { get; set; }

  }

  public class ProductionProcessDto
  {
    public string Key { get; set; }
    public string Value { get; set; }
    public FileDto File { get; set; }
  }

  public class NutritionDto
  {
    public string Key { get; set; }
    public string Value { get; set; }
  }

  public class ProductCompositionDto
  {
    public string Key { get; set; }
    public string Value { get; set; }
  }

File Dto:

public class FileDto
  {
    public string Base64EncodedFile { get; set; }
    public string OriginalName { get; set; }
    public string InternalName { get; set; }
    public string Type { get; set; }
  }

Automapper so far:

//Product
      CreateMap<Nutrition, NutritionDto>().ReverseMap();
      CreateMap<ProductComposition, ProductCompositionDto>().ReverseMap();
      CreateMap<ProductionProcessDto, ProductionProcess>()
        .ForMember(dest => dest.FileInternalName, opt => opt.MapFrom(src => src.File.InternalName))
        .ForMember(dest => dest.FileOriginalName, opt => opt.MapFrom(src => src.File.OriginalName))
        .ReverseMap();

      CreateMap<Product, ProductDto>()
        .ForMember(d => d.File, o => o.MapFrom(s => Mapper.Map<Product, FileDto>(s)))
        .ForMember(d => d.Nutritions, o => o.MapFrom(s => s.Nutritions))
        .ForMember(d => d.Composition, o => o.MapFrom(s => s.Composition))
        .ForMember(d => d.ProductionProcess, o => o.MapFrom(s => s.ProductionProcess))
        .ForMember(d => d.Ingredients, o => o.MapFrom(s => s.ProductIngredient.Select(pi => pi.Ingredients)))
        .ReverseMap();
      CreateMap<ProductDto, Product>()
        .ForMember(d => d.FileName, o => o.MapFrom(s => s.File.InternalName))
        .ReverseMap();

I am able to map from ProductDto (on data post) to Product but not other way around, all help much appreciated

Thanks

Upvotes: 1

Views: 581

Answers (1)

sziszu
sziszu

Reputation: 320

This code solved my issue:

.ForMember(d => d.File, o => o.MapFrom(model => new FileDto { InternalName = model.FileName }))

Applied to:

CreateMap<Product, ProductDto>()

Upvotes: 1

Related Questions