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
相关产品推荐
相关产品推荐

