使用AutoMapper映射RegisterVm与RegistrationRequest类时出错求助
AutoMapper双向映射错误解决
我定义了RegisterVm和RegistrationRequest两个类,尝试通过CreateMap<RegisterVm, RegistrationRequest>().ReverseMap();实现双向映射,但触发了映射错误。类代码如下:
public class RegisterVm { [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } [Required] public string Mobile { get; set; } [Required] public string UserName { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } } public class RegistrationRequest { [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } [Required] public string Mobile { get; set; } [Required] public string UserName { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } }
错误截图:
排查与解决步骤
确认AutoMapper配置类已正确注册
必须将包含映射规则的Profile类注册到服务容器中,否则AutoMapper无法识别你的映射配置。- 先创建映射配置类:
public class AppMappingProfile : Profile { public AppMappingProfile() { CreateMap<RegisterVm, RegistrationRequest>().ReverseMap(); } } - 在项目启动文件中注册:
// .NET Core/.NET 5+ Program.cs示例 builder.Services.AddAutoMapper(typeof(AppMappingProfile));
- 先创建映射配置类:
避免使用静态Mapper方法,改用依赖注入
AutoMapper 9.0+已弃用静态Mapper.Map方法,强制使用依赖注入获取IMapper实例:public class YourControllerOrService { private readonly IMapper _mapper; public YourControllerOrService(IMapper mapper) { _mapper = mapper; } public void YourMethod() { var vm = new RegisterVm(); // 正向映射 var request = _mapper.Map<RegistrationRequest>(vm); // 反向映射 var reversedVm = _mapper.Map<RegisterVm>(request); } }处理Nullable引用类型问题
如果项目启用了Nullable引用类型(项目文件中<Nullable>enable</Nullable>),类中未初始化的字符串属性会触发空引用相关警告或错误。可以给属性设置默认值:public string FirstName { get; set; } = string.Empty;或者在映射时配置允许空值:
CreateMap<RegisterVm, RegistrationRequest>() .ForAllMembers(opt => opt.AllowNull()) .ReverseMap();验证属性映射匹配性
虽然两个类属性完全一致,但如果存在隐性差异(比如命名空间冲突),可以显式指定映射规则确保匹配:CreateMap<RegisterVm, RegistrationRequest>() .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName)) .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.LastName)) .ForMember(dest => dest.Mobile, opt => opt.MapFrom(src => src.Mobile)) .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.UserName)) .ForMember(dest => dest.Password, opt => opt.MapFrom(src => src.Password)) .ReverseMap();
内容的提问来源于stack exchange,提问作者Hamed Salemi
相关产品推荐
相关产品推荐

