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

如何全局配置AutoMapper 13,默认用下划线拆分复杂属性路径?

解决AutoMapper 13全局设置下划线命名约定不生效的问题

问题原因

你遇到的情况是因为AutoMapper 13中,每个Profile实例在构造时会默认将自身的DestinationMemberNamingConvention设为PascalCaseNamingConvention.Instance,这个实例级的设置优先级高于通过AddAutoMapper全局配置的规则,所以你之前的全局配置会被每个Profile的默认值覆盖。

可行解决方案

方案1:创建基类Profile批量统一设置

这是最省心的方案,只需要创建一个基类Profile,所有现有Profile继承它,一次性搞定所有配置:

  1. 新建一个基类:
using AutoMapper;
using AutoMapper.Configuration.Conventions;

public class BaseUnderscoreProfile : Profile
{
    public BaseUnderscoreProfile()
    {
        DestinationMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;
    }
}
  1. 批量修改所有现有Profile的继承关系:
    用IDE的全局替换功能(比如Visual Studio的Ctrl+Shift+H),将所有文件中的: Profile替换为: BaseUnderscoreProfile,500个文件几秒就能改完。

方案2:遍历所有Profile强制修改命名约定

如果不想修改现有Profile的继承关系,可以在AutoMapper配置阶段,遍历所有加载的Profile并强制设置命名约定:

services.AddAutoMapper((sp, cfg) =>
{
    // 先加载所有程序集内的Profile
    cfg.AddMaps(Assembly.GetExecutingAssembly());
    
    // 遍历每个Profile,覆盖命名约定
    foreach (var profile in cfg.Profiles)
    {
        profile.DestinationMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;
    }
}, Assembly.GetExecutingAssembly());

这个方案会在所有Profile加载完成后,逐个修改它们的实例配置,确保全局生效。

验证方法

调试时可以在配置完成后,检查任意Profile的DestinationMemberNamingConvention属性,应该已经变成LowerUnderscoreNamingConvention.Instance,此时下划线分隔的目标属性(如Account_Name)就能自动映射Account.Name了。

内容的提问来源于stack exchange,提问作者user24118918

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:43:16