Automapper 4.2.1映射嵌套基类至扁平DTO遇配置缺失异常求助
嘿,我之前也踩过AutoMapper 4.x版本处理抽象基类子类映射的坑,你遇到的这个Missing type map configuration or unsupported mapping异常,本质是AutoMapper默认不会自动识别抽象基类的子类映射配置,得我们手动帮它理清关系。下面是一步步的解决思路:
1. 必须显式配置每个子类的映射规则
AutoMapper不会因为你配置了抽象基类ScheduleData的映射,就自动帮你处理它的子类ActionItemScheduleData、FormScheduleData。所以第一步要给每个子类单独加映射,同时把它们和基类的映射关联起来。
举个实际的配置例子(假设你要映射到对应的DTO类):
// 先配置基类的基础映射 Mapper.CreateMap<ScheduleData, ScheduleDataDto>(); // 显式添加每个子类的映射,这里要注意源和目标的子类要对应 Mapper.CreateMap<ActionItemScheduleData, ActionItemScheduleDataDto>(); Mapper.CreateMap<FormScheduleData, FormScheduleDataDto>(); // 最后配置Schedule的映射,确保嵌套的ScheduleData能正确映射 Mapper.CreateMap<Schedule, ScheduleDto>() .ForMember(dest => dest.ScheduleDataDto, opt => opt.MapFrom(src => src.ScheduleData));
2. 用Include方法关联基类与子类映射
在AutoMapper 4.x里,有个更清晰的方式:在基类的映射配置里用Include方法,把所有子类的映射关联到基类上,这样AutoMapper处理基类实例时,会自动匹配对应的子类映射规则:
// 基类映射里Include所有子类的映射关系 Mapper.CreateMap<ScheduleData, ScheduleDataDto>() .Include<ActionItemScheduleData, ActionItemScheduleDataDto>() .Include<FormScheduleData, FormScheduleDataDto>(); // 然后配置每个子类的具体映射(如果有额外字段需要映射的话) Mapper.CreateMap<ActionItemScheduleData, ActionItemScheduleDataDto>(); Mapper.CreateMap<FormScheduleData, FormScheduleDataDto>(); // Schedule的映射直接配置即可,嵌套的部分会自动处理 Mapper.CreateMap<Schedule, ScheduleDto>();
3. 检查映射调用的类型是否正确
有时候异常是因为调用Map时指定的类型不对,比如你如果写了:
// 这种写法其实没问题,但如果没配置Include的话就会报错 var dto = Mapper.Map<ScheduleDataDto>(schedule.ScheduleData);
不过只要你按上面的方式配置了Include,这个调用就会自动识别子类类型并映射。但要确保你没有错误地指定了不匹配的目标类型。
4. 提前验证配置是否正确
在程序启动的时候,一定要调用Mapper.AssertConfigurationIsValid(),这个方法会帮你检查所有映射配置是否完整,有没有遗漏的子类映射,能提前发现问题,避免运行时才抛出异常:
// 在项目启动的初始化代码里执行 Mapper.AssertConfigurationIsValid();
小提醒:版本局限性
AutoMapper 4.2.1确实比较老了,新版本(比如6.x及以上)对抽象类子类的映射支持更智能,甚至能自动识别。但如果因为项目限制只能用4.2.1,上面的方法绝对能解决你的问题。
你可以先检查自己的配置,重点看有没有显式添加子类的映射,以及是否用Include把子类和基类的映射关联起来,应该就能搞定这个异常了。
内容的提问来源于stack exchange,提问作者gdbj

