Automapper 8映射无法正常工作

时间:2019-02-09 22:56:16

标签: automapper automapper-6 automapper-8

当我尝试使用Automapper ForMember方法映射不同名称的不同属性时,我有两个模型类。它在不同属性的映射上引发自动映射器配置验证异常。

我已经尝试了很多,但是并没有帮助。我不知道为什么当我尝试将Quantity属性与Quntity属性映射时会引发异常。但是当我在两个模型类中都输入相同名称的属性时,它就起作用了

下面是有关自动映射器的所有模型类,异常和配置。

请问我如何解决问题?

 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>();

            });
        }
    }

以下是异常详细信息

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 

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:3)

您使用的是Profile错误的see the documentation on Profiles

您的个人资料应如下所示:

 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>();

        }
    }

从您的Profile内部摆脱该Mapper.Initialize调用,并更改该Profile以使用构造函数,而不管Configure方法如何。名称匹配时也不需要MapFrom,即“ AutoMapper”的“自动”。