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

AutoMapper映射Dto至Model返回空对象问题求助

搞定AutoMapper映射后Model全空的问题

嘿,我来帮你一步步排查这个问题——首先看你提供的代码里,有个非常明显的语法错误,这大概率是Model全空的直接原因,然后还有几个映射配置的细节需要调整。

1. 先修正Dto初始化的语法错误

你在创建TheDto实例的时候,把属性之间的逗号写成了分号:

// 错误写法
var dto = new TheDto{ Id = null, Type = Guid.NewGuid(), Title = null; Description = "any desc"; }

这种写法会导致编译失败,就算勉强运行,Dto的属性也不会被正确赋值,映射出来的Model自然就是空的。改成逗号分隔就好:

// 正确写法
var dto = new TheDto{ Id = null, Type = Guid.NewGuid(), Title = null, Description = "any desc" };

2. 补全AutoMapper的映射配置

就算修正了语法,还有几个映射的坑要填,避免Model出现不符合预期的空值:

  • 未映射的属性处理:你的TheModel里有Internal和AnotherInternal两个属性,但TheDto里没有对应的字段。你给Internal设置了NullSubstitute,但这个配置是针对源属性为空的情况,而这里源属性根本不存在,应该直接指定默认值:
    .ForMember(dest => dest.Internal, opt => opt.MapFrom(_ => ""))
    
    如果AnotherInternal也需要默认值,同样可以加上类似的配置。
  • Title属性的可空转换:TheDto的Title是可空字符串,但TheModel的Title是非可空的(虽然用null!抑制了警告)。如果Dto的Title为null,映射后Model的Title会是null,这可能引发运行时问题,建议加上NullSubstitute:
    .ForMember(dest => dest.Title, opt => opt.NullSubstitute(""))
    
  • Id属性的配置:你当前的配置是把Dto的空Id替换成Guid.Empty,这没问题,但要确认这是你想要的行为——毕竟Model的Id本身是可空的,如果你想保留null,可以去掉这个配置。

3. 修正后的完整代码

把这些调整整合后,代码应该是这样的:

// 映射配置
CreateMap<TheDto, TheModel>()
    .ForMember(dest => dest.Id, opt => opt.MapFrom(dto => dto.Id ?? Guid.Empty))
    .ForMember(dest => dest.Title, opt => opt.NullSubstitute(""))
    .ForMember(dest => dest.Internal, opt => opt.MapFrom(_ => ""))
    .ForMember(dest => dest.AnotherInternal, opt => opt.NullSubstitute("")); // 可选,按需设置

// 正确初始化Dto并执行映射
var dto = new TheDto{ Id = null, Type = Guid.NewGuid(), Title = null, Description = "any desc" };
var model = _mapper.Map<TheModel>(dto);

这样执行后,Model的所有属性都会被正确赋值,不会再出现全空的情况啦。

内容的提问来源于stack exchange,提问作者Sherif Botros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:07:59