AutoMapper强制要求映射所有属性的技术问题咨询
解决AutoMapper强制映射所有属性的问题
嘿,我刚好遇到过类似的情况!因为ApplicationUser继承了IdentityUser,自带了一大堆默认属性(比如Id、Email、PhoneNumber、PasswordHash这些),而你的RegistrationViewModel里只定义了三个属性,AutoMapper就会要求你处理所有未映射的属性。这里有几个实用的解决办法:
方法1:显式忽略不需要映射的属性(推荐)
你可以在映射配置里,先映射需要的属性,然后用ForAllOtherMembers一次性忽略剩下的所有属性,不用一个个手动写Ignore():
public class ViewModelToEntityMappingProfile : Profile { public ViewModelToEntityMappingProfile() { CreateMap<RegistrationViewModel, ApplicationUser>() // 映射ViewModel里的属性到对应的实体属性 .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.Username)) // 注意:IdentityUser里存储密码的是PasswordHash字段,不是直接存Password .ForMember(dest => dest.PasswordHash, opt => opt.MapFrom(src => src.Password)) // 忽略所有其他未显式映射的属性 .ForAllOtherMembers(opt => opt.Ignore()); } }
这里提醒下,实际项目里不要直接把明文Password映射到PasswordHash,记得加上密码加密的逻辑哦。
方法2:全局配置忽略未映射属性
如果你希望所有映射都自动忽略未显式配置的属性,可以在注册AutoMapper的时候全局设置:
var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<ViewModelToEntityMappingProfile>(); // 全局忽略所有未映射的属性 cfg.IgnoreUnmapped(); // 允许目标属性为null(可选) cfg.AllowNullDestinationValues = true; }); var mapper = mapperConfig.CreateMapper();
不过这个方法要谨慎使用,全局设置会影响所有映射规则,万一其他映射需要严格检查未映射属性,就会出问题。
方法3:关闭AutoMapper的配置验证
如果你开启了AssertConfigurationIsValid()来验证映射配置,它会强制检查所有属性是否都被映射。你可以针对特定映射关闭验证:
CreateMap<RegistrationViewModel, ApplicationUser>() .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.Username)) .ForMember(dest => dest.PasswordHash, opt => opt.MapFrom(src => src.Password)) .DisableCtorValidation();
或者在全局配置里关闭所有验证:
var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<ViewModelToEntityMappingProfile>(); // 关闭全局配置验证 cfg.ValidateInlineMaps = false; });
内容的提问来源于stack exchange,提问作者rbasniak
相关产品推荐
相关产品推荐

