.NET6分层应用:配置AutoMapper使源空子对象覆盖目标子对象
全局配置AutoMapper让源null子对象覆盖目标已有子对象(.NET 6)
在使用_mapper.Map(source, destination)更新ORM实体时,AutoMapper默认不会用源DTO中的null子对象覆盖目标实体中已存在的非null子对象。要实现全局生效的覆盖规则,可通过MapperConfiguration进行如下配置:
全局配置方案
通过ForAllMaps和ForAllMembers组合配置,取消AutoMapper默认的"源属性非null才映射"的限制,同时允许目标属性被设置为null:
var mapperConfig = new MapperConfiguration(cfg => { // 注册常规映射关系 cfg.CreateMap<DummyDto, Dummy>(); cfg.CreateMap<ChildDto, Child>(); // 全局生效的规则:允许源null覆盖目标属性 cfg.ForAllMaps((typeMap, mappingExpr) => { mappingExpr.ForAllMembers(opt => { // 移除默认的null过滤条件,无论源属性是否为null都执行映射 opt.Condition((src, dest, srcMember) => true); // 明确允许目标属性被赋值为null opt.AllowNull(); }); }); }); // 初始化Mapper var _mapper = mapperConfig.CreateMapper();
配置效果验证
使用你提供的示例代码测试:
var dummyOrm = new Dummy() { Child = new Child() { SomeValue = "Foo" }, Child2 = new Child() { SomeValue = "Baz" } }; var dummyDto = new DummyDto() { Child = new ChildDto() { SomeValue = "updated" }, Child2 = null }; // 执行映射 _mapper.Map(dummyDto, dummyOrm);
此时dummyOrm的结果会符合预期:
{ "Child": { "SomeValue": "updated" }, "Child2": null }
局部覆盖全局规则
如果部分映射不需要此全局规则,可在单独的映射配置中覆盖:
cfg.CreateMap<OtherDto, OtherEntity>() .ForMember(dest => dest.SpecificProp, opt => // 仅当源属性非null时才映射 opt.Condition((src, dest, srcVal) => srcVal != null));
内容的提问来源于stack exchange,提问作者DavisZ
相关产品推荐
相关产品推荐

