1

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

1 Answer 1

1

This code solved my issue:

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

Applied to:

CreateMap<Product, ProductDto>()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.