AutoMapper 6.2.2:如何仅映射匹配属性名并忽略其他属性?
解决AutoMapper仅映射共有属性并忽略未映射字段的问题
嘿,我之前在使用AutoMapper 6.x版本时也遇到过几乎一模一样的问题,尤其是和EF结合更新实体的时候,导航属性总是搞出未映射的错误。给你几个不用逐个配置40多个属性的解决方案:
方案一:针对单个映射忽略所有未匹配属性
在你的映射配置文件里,给ViewModel到Entity的映射加上ForAllOtherMembers设置,让AutoMapper自动忽略所有源(ViewModel)里不存在的目标(Entity)属性:
CreateMap<YourViewModel, YourEntity>() // AutoMapper会自动映射名称匹配的属性 .ForAllOtherMembers(opt => opt.Ignore());
这样一来,不管Entity里有多少个导航属性或者独有的字段,只要ViewModel里没有对应的属性,都会被自动忽略,不会再触发未映射属性的错误。
方案二:全局配置所有映射忽略未匹配属性
如果你有很多类似的映射都需要这个规则,可以直接在AutoMapper的全局配置里设置,不用每个映射都写一遍:
var mapperConfig = new MapperConfiguration(cfg => { // 添加你的映射配置文件 cfg.AddProfile<YourMappingProfile>(); // 对所有映射应用规则:忽略源中不存在的目标属性 cfg.ForAllMaps((mapExpression, mappingConfig) => { mappingConfig.ForAllOtherMembers(opt => opt.Ignore()); }); });
这个配置会让所有的映射都默认忽略未匹配的属性,非常适合你的场景——毕竟两个类都有40多个属性,逐个配置太麻烦了。
结合EF更新实体的注意事项
另外,因为你是用EF更新实体,记得不要直接映射生成新的Entity实例,而是先从数据库中获取已存在的实体,再把ViewModel的数据映射到这个实例上:
// 从数据库获取要更新的实体 var existingEntity = dbContext.YourEntities.Find(viewModel.Id); // 把ViewModel的属性映射到已有的实体上 Mapper.Map(yourViewModel, existingEntity); // 保存更改 dbContext.SaveChanges();
这种方式不仅能保留Entity中原有的导航属性和关联对象,还能让AutoMapper只更新那些ViewModel里有的属性,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Rokal
相关产品推荐
相关产品推荐

