AutoMapper映射GRPC对象生成空目标对象问题求助
解决AutoMapper将gRPC源对象映射为null的问题
核心问题分析
你的映射配置存在多处类型不匹配错误,加上可能的AutoMapper未正确注册,导致映射失败返回null:
- 未映射目标对象的
Id字段(对应源对象的orderID) - 数值类型映射错误使用字符串插值,引发类型不匹配
- Google Protobuf Timestamp转DateTime的方式错误,触发类型转换异常
分步解决方案
1. 确保AutoMapper正确注册
在Program.cs(或Startup.cs)中添加AutoMapper服务注册,扫描Profile所在程序集:
builder.Services.AddAutoMapper(typeof(SubmitOrderProfile));
2. 修复映射Profile配置
修正类型转换错误,补充缺失的字段映射:
using AutoMapper; using Google.Protobuf.WellKnownTypes; using SubmitOrderService.Models; namespace SubmitOrderService { public class SubmitOrderProfile: Profile { public SubmitOrderProfile() { CreateMap<submitOrder, Submit_Order>() // 补充Id字段映射 .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.OrderID)) // 直接映射字符串,无需插值 .ForMember(dest => dest.Comments, opt => opt.MapFrom(src => src.Comment)) // 正确转换Protobuf Timestamp到DateTime .ForMember(dest => dest.CreatedAt, opt => opt.MapFrom(src => src.CreatedOn.ToDateTime())) // 数值类型直接映射,避免字符串插值导致类型不匹配 .ForMember(dest => dest.CountChicken, opt => opt.MapFrom(src => src.Chicken)) .ForMember(dest => dest.CountBeef, opt => opt.MapFrom(src => src.Beef)) .ForMember(dest => dest.CountShrimp, opt => opt.MapFrom(src => src.Shrimp)) .ForMember(dest => dest.CountTofu, opt => opt.MapFrom(src => src.Tofu)) .ReverseMap(); } } }
3. 启用配置验证排查问题
注册AutoMapper时启用配置验证,可提前发现映射错误:
builder.Services.AddAutoMapper(cfg => { cfg.ValidateInlineMaps = false; cfg.AssertConfigurationIsValid(); }, typeof(SubmitOrderProfile));
或在映射代码前手动验证:
_mapper.ConfigurationProvider.AssertConfigurationIsValid(); var order1 = _mapper.Map<Submit_Order>(reqOrder);
4. 检查gRPC对象属性访问权限
确认gRPC生成的submitOrder类所有属性(如OrderID、Beef等)为公共可访问状态(gRPC默认生成公共属性,特殊配置需单独确认)。
关键注意点
- 禁止对值类型使用字符串插值映射,会引发类型不匹配,导致AutoMapper内部异常返回null
- Protobuf的
Timestamp类型需通过ToDateTime()或ToDateTimeOffset()方法转换为.NET的DateTime类型,不能直接用字符串插值 - 确保目标对象所有字段都有对应映射配置(
Id与orderID名称不匹配,必须手动配置)
内容的提问来源于stack exchange,提问作者mgh
相关产品推荐
相关产品推荐

