AutoMap Reverse模式下Ignore属性未生效问题咨询
问题解答
这不是正常现象,是AutoMapper中ReverseMap与[Ignore]特性的作用范围导致的问题。
原因分析
当你在UserDto上使用[AutoMap(typeof(User), ReverseMap = true)]时,会自动生成两个映射规则:
- 正向映射(User → UserDto):此时
UserDto上的[Ignore]特性生效,映射时会忽略Password属性,不会将User的Password复制到UserDto。 - 反向映射(UserDto → User):
ReverseMap仅自动生成反向的基础映射规则,但不会自动将源类(UserDto)的[Ignore]特性应用到反向映射中。因为[Ignore]特性默认作用是忽略当前类的成员作为「目标成员」时的映射,而非作为「源成员」时。当从UserDto映射到User时,UserDto.Password是源成员,[Ignore]不会阻止它被复制到User.Password。
解决方案
要让反向映射也忽略Password属性,需要显式配置反向映射规则:
方式1:使用Profile类手动配置
public class UserProfile : Profile { public UserProfile() { CreateMap<User, UserDto>() .ReverseMap() // 显式忽略反向映射中的Password属性 .ForMember(dest => dest.Password, opt => opt.Ignore()); } }
方式2:特性补充配置(不推荐)
如果坚持使用特性,可以在User实体的Password属性上标记[Ignore],但这种方式会影响所有以User为目标的映射,灵活性较差。
验证
修改配置后,执行_mapper.Map(dto, user)时,UserDto.Password就不会再被复制到User.Password了。
内容的提问来源于stack exchange,提问作者Vijay Kumar
相关产品推荐
相关产品推荐

