AutoMapper 配置不生效主因是未调用 CreateMapper() 获取 IMapper 实例或未注册类型映射;6.0+ 废弃静态 Mapper,须用 new MapperConfiguration(cfg => cfg.CreateMap<S,D>()) 并通过 configuration.CreateMapper() 创建实例。

AutoMapper 配置后不生效,Map 返回 null 或原始对象
常见原因是没调用 MapperConfiguration.CreateMapper() 获取实际的映射器实例,或者忘了在配置中注册类型映射。AutoMapper 6.0+ 强制要求显式创建 IMapper 实例,不能直接用静态 Mapper.Map(该 API 已废弃且默认未启用)。
- 确保用
new MapperConfiguration(cfg => cfg.CreateMap<Source, Destination>())定义映射规则 - 必须通过
configuration.CreateMapper()得到IMapper实例,再调用mapper.Map<Destination>(source) - 如果用了 ASP.NET Core,推荐在
Startup.ConfigureServices中用services.AddAutoMapper(typeof(Startup))自动扫描配置类,否则手动 new 的配置容易被 GC 掉或重复初始化
C# 中 CreateMap 的 ForMember 怎么写才不会报空引用
ForMember 是为特定属性定制映射逻辑的关键方法,但写错表达式或访问了 null 源字段就会在运行时抛 NullReferenceException,尤其在嵌套对象或可空类型场景下。
- 源属性路径必须真实存在且可读:写成
src => src.Address.Street前,确保src.Address不为 null;否则改用src => src.Address?.Street(C# 6+)或加NullSubstitute - 目标属性名必须拼写完全一致,大小写敏感:
ForMember(dest => dest.UserName, ...)不能写成dest => dest.username - 避免在
MapFrom里调用可能抛异常的方法;如需转换,先用ConvertUsing封装异常处理逻辑
ASP.NET Core 项目里 AutoMapper 和依赖注入怎么配合不踩坑
AutoMapper 本身不绑定 DI 容器,但官方包 AutoMapper.Extensions.Microsoft.DependencyInjection 提供了开箱即用的集成。漏装包、错配生命周期或混淆配置作用域是高频问题。
- 必须安装
AutoMapper.Extensions.Microsoft.DependencyInjection,不是只装AutoMapper -
AddAutoMapper默认只扫描传入类型的所在程序集;若配置类在其他类库,要显式指定程序集:AddAutoMapper(typeof(MyProfile).Assembly) -
IMapper是瞬态(Transient)服务,每次注入都是新实例;不要把它存为静态字段或单例缓存——配置变更不会生效,且线程不安全
从 DataTable 或匿名对象映射到实体时为什么 Map 失败
AutoMapper 默认只支持强类型到强类型的映射。DataTable、ExpandoObject、字典等非编译期已知结构的数据,需要额外配置或换方案。
- 对
DataTable,建议先用DataTable.AsEnumerable().Select(...)转成IEnumerable<T>再映射,别试图直连Map<T>(dataTable) - 匿名类型无法被反射获取完整类型信息,
CreateMap<anonymous, T>()编译不过;应改用具名类,或用ProjectTo<T>(需 EF Core + LINQ 查询上下文) - 如果真要映射字典,得用
CreateMap<IDictionary<string, object>, Target>()并配合ForAllMembers手动绑定,但性能差、易出错,不推荐生产使用
最麻烦的其实是嵌套集合里的 null 元素和类型擦除问题——比如 JSON 反序列化后的 JObject 到实体,AutoMapper 根本不认识,这时候就得退回到手动赋值或用 JsonSerializer.Deserialize<T> 直接转。










