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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:05:11