AutoMapper继承映射异常:缺失类型映射配置或不支持映射
问题描述
我有四个类:Application、CaperData、ApplicationDTO、CaperDataDTO。其中Application继承自CaperData,ApplicationDTO包含一个CaperDataDTO类型的属性。CaperData与CaperDataDTO属性完全一致;Application与ApplicationDTO属性基本一致,区别在于前者继承自CaperData,后者则包含CaperDataDTO属性。
需要通过AutoMapper实现双向映射:Application ↔ ApplicationDTO、CaperData ↔ CaperDataDTO。
类定义
using AutoMapper; public class Application : CaperData { // Application专属属性和方法 } public class CaperData { // CaperData专属属性和方法 } public class ApplicationDTO { public CaperDataDTO CopData { get; set; } // ApplicationDTO专属其他属性和方法 } public class CaperDataDTO { // CaperDataDTO专属属性和方法 }
尝试的映射配置
CreateMap<CaperData, CaperDataDTO>(); CreateMap<CaperDataDTO, CaperData>(); CreateMap<Application, ApplicationDTO>() .ForMember(dest => dest.CapData, opt => opt.MapFrom(src => src)); CreateMap<ApplicationDTO, Application>() .ForMember(dest => dest.AppName, opt => opt.MapFrom(src => src.CapData.AppName)) .ForMember(dest => dest.ErrorMessage, opt => opt.MapFrom(src => src.CapData.ErrorMessage)) .ForMember(dest => dest.Reason, opt => opt.MapFrom(src => src.CapData.Reason));
执行代码与异常
执行如下映射代码时:
List<Application> apps = _appRepo.GetData(); var mappedApps = _mapper.Map<ApplicationDTO>(apps );
抛出异常:
Missing type map configuration or unsupported mapping. Mapping types: List`1 -> ApplicationDTO System.Collections.Generic.List`1[[DAL.Model.Application, DAL, Version=3.12.0.0, Culture=neutral, PublicKeyToken=null]] -> Client.Models.ApplicationDTO`
请问如何在MappingProfile中正确配置映射?
解决方案
1. 修正调用代码的类型不匹配问题
当前错误核心是把List<Application>映射成单个ApplicationDTO,AutoMapper没有这种默认映射逻辑。正确调用需匹配集合类型:
var mappedApps = _mapper.Map<List<ApplicationDTO>>(apps);
2. 完善AutoMapper配置
(1)修正属性名称笔误
原配置中DTO的属性是CopData,但代码里写的是CapData,这会导致映射失败,必须先修正名称匹配问题。
(2)完整映射配置
利用AutoMapper的继承映射和已配置的基础类型映射,无需手动逐个映射属性:
public class YourMappingProfile : Profile { public YourMappingProfile() { // 基础类型双向映射,自动匹配同名属性 CreateMap<CaperData, CaperDataDTO>().ReverseMap(); // Application ↔ ApplicationDTO 双向映射 CreateMap<Application, ApplicationDTO>() // 将Application的CaperData部分映射到DTO的CopData .ForMember(dest => dest.CopData, opt => opt.MapFrom(src => src)) // 自动映射Application与ApplicationDTO的专属同名属性 .ReverseMap() // 将DTO的CopData映射回Application的CaperData部分 .ForMember(dest => dest, opt => opt.MapFrom(src => src.CopData)); } }
配置说明
ReverseMap()用于快速生成双向映射规则,减少重复代码- 因为
Application继承自CaperData,AutoMapper会自动复用CaperData↔CaperDataDTO的映射规则处理继承属性 - 只要原类与DTO的专属属性名称一致,AutoMapper会自动完成映射,无需手动配置
ForMember
3. 验证要点
- 确保所有属性名称在原类与DTO中完全匹配
- 调用时目标类型必须与源类型的集合/单例属性一致
- 确认AutoMapper已经正确注入到项目中,且
YourMappingProfile已被注册
内容的提问来源于stack exchange,提问作者Hanady
相关产品推荐
相关产品推荐

