AutoMapper 7.0.1升级至11.0.0后出现类型映射配置缺失报错
AutoMapper 7.0.1升级11.0.0映射缺失报错排查
最高优先级排查点:类型映射配置与实际调用类型不匹配
从你贴的代码可以直接定位到核心问题:注册的映射规则和实际执行映射的类型对完全不匹配。
- 你在配置里写的映射规则是
CreateMap<Group, GroupViewModel>(),注册的是Group到GroupViewModel的转换 - 实际调用映射时用的是
_mapper.Map<List<Group>, List<GroupVM>>(mGroup),目标类型是GroupVM - 额外佐证:配置里专门写了
.ForMember(x => x.GroupId, opt => opt.MapFrom(c => c.Id))、.ForMember(x => x.LastUpdateUserName, opt => opt.MapFrom(c => c.LastUpdateUser.UserName))两个属性映射规则,但你贴出的GroupVM类定义里根本没有GroupId、LastUpdateUserName这两个属性,说明你配置映射用的GroupViewModel和实际使用的GroupVM是两个不同的类型(大概率是之前重构类名时漏改了CreateMap的泛型参数)。
AutoMapper的类型映射是严格按精确类型匹配的,哪怕两个类的属性结构100%一致,只要类型全名(命名空间+类名)不同,没有注册对应映射就会直接抛出你贴出的「Missing type map configuration or unsupported mapping」错误,把CreateMap的目标类型从GroupViewModel改成实际使用的GroupVM即可解决这个核心报错。
其他升级适配排查点
如果确认类型名只是贴代码时的笔误,实际配置的类型和调用类型完全匹配,再检查以下几个AutoMapper 11.0相对于7.0版本的破坏性变更导致的问题:
- 检查程序集扫描注册逻辑:11版本对应的DI集成包调整了程序集扫描规则,如果你是用
AddAutoMapper方法传入程序集自动扫描Profile类注册映射,要确认存放映射配置的程序集被正确加载,没有被程序集裁剪、延迟加载逻辑漏掉。可以在应用启动后、执行业务映射前调用_mapper.ConfigurationProvider.AssertConfigurationIsValid(),执行后会直接列出所有已注册的映射、缺失的配置,一眼就能看到对应映射有没有被正确注册。 - 检查可空值类型映射行为:从8.0版本开始AutoMapper调整了可空值类型的默认映射规则,你的源实体
Group中DateCreated、LastUpdate都是DateTime?可空类型,但是目标GroupVM中这两个字段是不可空的DateTime,旧版本可能默认给了空值兜底不抛错,新版本如果源属性为null会直接抛出映射异常,这个是修复完类型不匹配问题后可能遇到的次级问题,按需调整目标类型为可空或者加空值兜底逻辑即可。 - 检查嵌套类型映射配置:你的
GroupVM中持有ApplicationUser类型的LastUpdateUser属性,旧版本可能默认按约定自动递归映射嵌套类型,新版本严格校验模式下需要你显式注册ApplicationUser对应的映射规则(如果目标类型也是ApplicationUser可以加.ForMember(x => x.LastUpdateUser, opt => opt.MapFrom(src => src.LastUpdateUser))显式声明,或者配置允许同类型对象直接拷贝)。
快速验证代码
在应用启动完成、AutoMapper注册完毕的位置加入以下代码,执行后会直接输出所有配置问题,不用等业务请求触发才找错:
// 校验所有AutoMapper配置合法性 var mapper = serviceProvider.GetRequiredService<IMapper>(); mapper.ConfigurationProvider.AssertConfigurationIsValid();
内容的提问来源于stack exchange,提问作者elbruce
相关产品推荐
相关产品推荐

