在AWS Lambda中使用AutoMapper映射对象时返回空值问题
问题原因与解决方案
核心问题:映射配置顺序错误
你的ForAllMembers(option => option.Ignore())调用顺序完全搞反了。AutoMapper是按代码编写顺序执行配置规则的,最后调用的ForAllMembers会覆盖之前所有的成员映射设置——等于你先手动配置了几个字段的映射,然后又告诉AutoMapper忽略所有成员,最终所有属性自然都是空值。
修正后的Profile配置
调整配置顺序,先忽略所有不需要默认映射的成员,再逐个指定需要映射的字段:
public MyCustomProfile() { // 先忽略Order到OrderDto的所有成员,再配置需要映射的字段 CreateMap<Order, OrderDto>() .ForAllMembers(option => option.Ignore()) .ForMember(dest => dest.Id, options => options.MapFrom(src => src.OrderId)) .ForMember(dest => dest.UserId, options => options.MapFrom(src => src.UserId ?? 0)) // 处理可空转非可空,避免空值异常 .ForMember(dest => dest.Email, options => options.MapFrom(src => src.Email)) .ForMember(dest => dest.PhoneNo, options => options.MapFrom(src => src.Phone)) .ForMember(dest => dest.LineDto, options => options.MapFrom(src => src.Lines)); // 同理处理Lines到LineDto的映射 CreateMap<Lines, LineDto>() .ForAllMembers(option => option.Ignore()) .ForMember(dest => dest.Id, options => options.MapFrom(src => src.ProductId)) .ForMember(dest => dest.PriceIncTax, options => options.MapFrom(src => src.Price)) .ForMember(dest => dest.Quantity, options => options.MapFrom(src => src.TotalQuantity)); }
额外优化建议
1. 不要重复创建Mapper实例
每次调用GetAutoMapperInstance()都新建MapperConfiguration和Mapper会浪费资源,尤其是在AWS Lambda这种高频执行环境下。建议全局初始化一次:
public static class AutoMapperConfig { private static readonly Lazy<IMapper> _mapper = new Lazy<IMapper>(() => { var config = new MapperConfiguration(cfg => { cfg.AddProfile(new MyCustomProfile()); }); config.AssertConfigurationIsValid(); // 开发阶段开启,验证配置是否有错误 return config.CreateMapper(); }); public static IMapper Mapper => _mapper.Value; }
业务代码里直接用:
private void GetOrder(Order order) { var myorder = AutoMapperConfig.Mapper.Map<OrderDto>(order); }
2. 处理可空类型转换
注意Order里的OrderId、UserId是可空的long?,但OrderDto里的对应字段是非可空的long,映射时必须处理空值情况(比如用?? 0设默认值,或根据业务逻辑抛异常),否则会触发运行时错误。
3. 验证配置正确性
开发阶段调用config.AssertConfigurationIsValid(),可以提前发现配置错误(比如字段名不匹配、类型转换问题),不用等到运行时才看到空值。
内容的提问来源于stack exchange,提问作者Saghar Francis
相关产品推荐
相关产品推荐

