You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:26:19