Automapper 8 mapping not working properly

2019-09-21 18:14发布

问题:

I have two model classes, when I try to map different properties of different name by using Automapper ForMember method. It throws an automapper configuration validation exception on the mapping of different property.

I have tried a lot but It does not help.I do not know why It is throwing an exception when I try to map Quantity property with Quntity property. but when I put same name of the property in both the model classes then it works

Below is located all the model classes, exception and configurations regarding automapper.

Could you please help me, that how to solve problem?

 public class ProductModel
    {
        public ProductModel()
        {
            Id = GuidContext.Current.NewGuid();
            ProductHistory = new HashSet<ProductHistoryModel>();
        }

        public Guid Id { get; set; }
        public string ProductCode { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public bool IsActive { get; set; }
        public decimal? Price { get; set; }
        public int? Quntity { get; set; }
        public Guid ProductCategoryId { get; set; }
        public Guid? BrandId { get; set; }

        public Guid ProductAttributeId { get; set; }

        public virtual BrandModel Brand { get; set; }
        public virtual ProductCategoryModel ProductCategory { get; set; }

        public virtual ProductAttributeModel ProductAttribute { get; set; }
        public virtual ICollection<ProductHistoryModel> ProductHistory { get; set; }
    }

The another class is 

public class ProductModel
    {       
        public string Name { set; get; }

        //public List<string> Attributes { set; get; }

        //public string Brand { get; set; }

        public decimal? Price
        {
            get; set;
        }
        public int? Quantity { get; set; }
    }
}

and the mapping configuration is

 public class ProductModelMapConfigurator :  Profile, IMapConfigurator
    {
        public void Configure()
        {
            Mapper.Initialize(cfg =>
            {
                CreateMap<StandardizeInventory.Models.Product.ProductModel, Models.ProductModel>()
                //.ForMember(dest => dest.Brand, opt => opt.MapFrom(src => src.Brand.Name))
                .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
                .ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price))
                .ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.Quntity));                
                //.AfterMap((src, dest) => {
                  //  dest.Attributes = src.ProductAttribute.ProductAttributeValue.Select(x => x.Value).ToList();
                //});

                CreateMap<Models.ProductModel, StandardizeInventory.Models.Product.ProductModel>();

            });
        }
    }

Below is the Exception Details

AutoMapper.AutoMapperConfigurationException: 

Unmapped members were found. Review the types and members below.

Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type

For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters

==========================================================================================

AutoMapper created this type map for you, but your types cannot be mapped using the current configuration.

ProductModel -> ProductModel (Destination member list)

StandardizeInventory.Models.Product.ProductModel -> InventoryStoreApi.Models.ProductModel (Destination member list)



Unmapped properties:

Quantity



   at AutoMapper.ConfigurationValidator.AssertConfigurationIsValid(IEnumerable`1 typeMaps) in 

Any help would be appreciated. Thanks

回答1:

You're using a Profile wrong, see the documentation on Profiles

Your profile should look like:

 public class ProductModelMapConfigurator :  Profile, IMapConfigurator
    {
        public ProductModelMapConfigurator()
        {

                CreateMap<StandardizeInventory.Models.Product.ProductModel, Models.ProductModel>()
                //.ForMember(dest => dest.Brand, opt => opt.MapFrom(src => src.Brand.Name))
                .ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.Quntity));                
                //.AfterMap((src, dest) => {
                  //  dest.Attributes = src.ProductAttribute.ProductAttributeValue.Select(x => x.Value).ToList();
                //});

                CreateMap<Models.ProductModel, StandardizeInventory.Models.Product.ProductModel>();

        }
    }

Get rid of that Mapper.Initialize call from inside your Profile, and change the profile to use a constructor, not whatever that Configure method is. You also don't need MapFrom when the names match, that's the "Auto" of "AutoMapper".