使用AutoMapper映射同参数record类型时遇缺失映射配置错误
问题场景
尝试使用AutoMapper映射字段完全一致的Record类型时,触发如下错误:
Missing type map configuration or unsupported mapping.
Mapping types:
TadaLegalEmployerDto -> TadaLegalEmployerModel
EmployeeAndEmployer.Api.Models.TadaDtos.TadaLegalEmployerDto -> EmployeeAndEmployer.Api.Application.Queries.GetTadaLegalEmployer.TadaLegalEmployerModel
Destination Member:
LegalEmployer
相关代码
源类型
public record TadaGetLegalEmployerResponseDto(string data, TadaLegalEmployerDto LegalEmployer, string Starter); public record TadaLegalEmployerDto(string SNationalId, string SRegistrationNumber, TadaCentralOfficeDto CentralOffice); public record TadaCentralOfficeDto(string Province);
目标类型
public record TadaGetLegalEmployerResponseModel(string data, TadaLegalEmployerModel LegalEmployer,string Starter); public record TadaLegalEmployerModel(string SNationalId, string SRegistrationNumber, TadaCentralOfficeModel CentralOffice); public record TadaCentralOfficeModel(string Province);
当前映射配置
public class GetLegalEmployerResponseDtoToGetLegalEmployerResponseModel : Profile { public GetLegalEmployerResponseDtoToGetLegalEmployerResponseModel() { CreateMap<TadaGetLegalEmployerResponseDto, TadaGetLegalEmployerResponseModel>(); } }
调用代码
var dto = await _myService.GetLegalEmployersAsync(); var resultModel = _mapper.Map<TadaGetLegalEmployerResponseModel>(dto);
问题原因
AutoMapper不会自动递归创建嵌套类型的映射规则,即使字段完全一致。你仅配置了顶层TadaGetLegalEmployerResponseDto到TadaGetLegalEmployerResponseModel的映射,但嵌套的TadaLegalEmployerDto→TadaLegalEmployerModel、TadaCentralOfficeDto→TadaCentralOfficeModel没有对应映射配置,导致报错。
解决方法
方法一:显式配置所有嵌套类型映射(推荐)
在同一个Profile中添加所有嵌套类型的映射规则,代码清晰且便于维护:
public class GetLegalEmployerResponseDtoToGetLegalEmployerResponseModel : Profile { public GetLegalEmployerResponseDtoToGetLegalEmployerResponseModel() { CreateMap<TadaGetLegalEmployerResponseDto, TadaGetLegalEmployerResponseModel>(); CreateMap<TadaLegalEmployerDto, TadaLegalEmployerModel>(); CreateMap<TadaCentralOfficeDto, TadaCentralOfficeModel>(); } }
方法二:开启自动创建缺失映射(不推荐大型项目使用)
如果想让AutoMapper自动处理兼容的嵌套类型映射,可以在初始化配置时开启CreateMissingTypeMaps选项,但这种方式可能带来不必要的性能开销和潜在的映射风险:
var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<GetLegalEmployerResponseDtoToGetLegalEmployerResponseModel>(); cfg.CreateMissingTypeMaps = true; }); var mapper = mapperConfig.CreateMapper();
内容的提问来源于stack exchange,提问作者Robabeh Ghasemi

