You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:05:34