'AutoMapper - Trying to flatten my object property to string but getting an error
I am trying to map my ProductDto
to Product
class. I get an error when mapping the string property in ProductDto
class to a Brand
property in the Product
class.
AutoMapper.AutoMapperMappingException: Error mapping types.
Mapping types:
ProductDto -> Product
SilksyAPI.Dto.ProductDto -> SilksyAPI.Entities.Product
Type Map configuration:
ProductDto -> Product
SilksyAPI.Dto.ProductDto -> SilksyAPI.Entities.Product
Destination Member:
Brand
---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.
Mapping types:
String -> Brand
System.String -> SilksyAPI.Entities.Brand
Here is my mapping profile:
CreateMap<Product, ProductDto>()
.ForMember(dest => dest.Brand, opt => opt.MapFrom(p => p.Brand.Name))
.ForMember(dest => dest.Categories, opt => opt.MapFrom(p => p.ProductCategories.Select(pc => pc.Category.Name)));
CreateMap<ProductDto, Product>()
.ForMember(dest => dest.Brand, opt => opt.MapFrom(src => src.Name));
Classes:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public int BrandId { get; set; }
public Brand Brand { get; set; }
public ICollection<ProductCategory> ProductCategories { get; set; }
}
public class Brand
{
public int Id { get; set; }
[Required]
[MaxLength(100)]
public string Name { get; set; }
}
Dto Class
public class ProductDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Brand { get; set; }
public List<string> Categories { get; set; }
}
I have tried different mapping profiles but I cannot map from ProductDto
to Product
but can map from Product
to ProductDto
with no problem.
Here are a few other things I tried
CreateMap<Brand, string>()
.IncludeMembers(b => b.Name);
CreateMap<Product, ProductDto>()
.ForMember(dest => dest.Brand, opt => opt.MapFrom(p => p.Brand.Name))
.ForMember(dest => dest.Categories, opt => opt.MapFrom(p => p.ProductCategories.Select(pc => pc.Category.Name)))
.ReverseMap();
And
Mapper.CreateMap<Brand, string>().ConvertUsing(source => source.Name ?? string.Empty);
Solution 1:[1]
From your first mapping profile, when mapping from ProductDto
to Product
, for Brand
property, you need to create a new Brand
instance as below:
cfg.CreateMap<ProductDto, Product>()
.ForMember(dest => dest.Brand, opt => opt.MapFrom(src => new Brand { Name = src.Name }));
For
.IncludeMembers()
I don't think it suits your scenario as you are mapping from object
to string
but not object
to object
.
For
.ConvertUsing()
You need to add the code below to mapping from string
to Brand
for Brand property.
cfg.CreateMap<string, Brand>()
.ConvertUsing(source => new Brand { Name = source });
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Yong Shun |