我收到消息“缺少类型映射配置或不受支持的映射”。

时间:2021-05-07 10:00:29

标签: c# asp.net-core .net-core automapper

我有两个班

    public class AddressRequestModel
    {
        public Guid? UserKey { get; set; }
        public string AddressLine1 { get; set; }
        public string AddressLine2 { get; set; }
        public int ZipCode { get; set; }
        public string Location { get; set; }
        public bool IsActive { get; set; }
    }
    public class AddressRequestModelList
    {
        public List<AddressRequestModel> AddressRequestModel { get; set; }
    }

一个实体

    public class Address
    {
        [Key]
        public Guid AddressKey { get; set; }
        public string AddressLine1{ get; set; }
        public string AddressLine2 { get; set; }
        public int ZipCode { get; set; }
        public string Location { get; set; }

        
        public Guid UserKey { get; set; }
   
        public bool IsActive { get; set; }
    }

和一个配置文件映射器

 public class Profiler :Profile
    { 
        public Profiler()
        {
           CreateMap<List<AddressRequestModelList>, List<Address>>();
        }

    }

映射此控制器时,我收到消息“缺少类型映射配置或不受支持的映射。”

public IEnumerable<AddressDto> CreateAddress(AddressRequestModelList addressRequestModel)
        {
                var requestModel = _mapper.Map<List<Address>>(addressRequestModel);
                ...
        }

我需要帮助。

1 个答案:

答案 0 :(得分:0)

指定集合类型之间的映射是不寻常的;通常你会映射项目类型:

public class Profiler : Profile
{ 
    public Profiler()
    {
       CreateMap<AddressRequestModel, Address>();
    }
}

AutoMapper 能够基于此执行集合映射:

public IEnumerable<AddressDto> CreateAddress(AddressRequestModelList addressRequestModel)
{
    var requestModel = _mapper.Map<List<Address>>(addressRequestModel.AddressRequestModel);
    //...
}

这比使用 List<T> 更灵活,因为可以根据需要使用其他集合类型:https://docs.automapper.org/en/stable/Lists-and-arrays.html


如果您必须指定到 List<T> 的映射,您可以执行以下操作:

public class Profiler : Profile
{ 
    public Profiler()
    {
       CreateMap<AddressRequestModel, Address>();

       CreateMap<AddressRequestModelList, List<Address>>()
           .ConstructUsing(
               (src, context) => context.Mapper.Map<List<Address>>(src.AddressRequestModel));
    }
}

public IEnumerable<AddressDto> CreateAddress(AddressRequestModelList addressRequestModel)
{
    var requestModel = _mapper.Map<List<Address>>(addressRequestModel);
    //...
}