AutoMapper 6.2.2无法映射复合对象问题求助
解决AutoMapper 6.2.2嵌套复合对象映射问题
嘿,我刚碰到过类似的情况,这就帮你搞定!你的问题核心在于AutoMapper默认只会匹配顶级同名属性,而你的目标字段JobID、JobType藏在JoinedJob的嵌套job属性里,得给AutoMapper明确指定映射路径才行。
第一步:先确认源类结构(我假设你的JobInfo是这样的,不一样的话调整下就行)
public class JobInfo { public int JobID { get; set; } public string JobType { get; set; } // 其他属性... } public class LocationInfo { // 你的位置相关属性... } public class JoinedJob { public JobInfo job { get; set; } public LocationInfo loc { get; set; } } public class JobDetailsModel { public int JobID { get; set; } public string JobType { get; set; } }
第二步:正确配置AutoMapper映射
你需要在创建映射时,用ForMember指定每个目标字段对应的源路径:
// 创建映射配置 var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<JoinedJob, JobDetailsModel>() // 明确指定从JoinedJob的job属性里取JobID .ForMember(dest => dest.JobID, opt => opt.MapFrom(src => src.job.JobID)) // 同样指定JobType的来源 .ForMember(dest => dest.JobType, opt => opt.MapFrom(src => src.job.JobType)); }); // 非常重要:验证配置是否正确,能提前发现遗漏的映射 mapperConfig.AssertConfigurationIsValid(); // 创建映射器实例 var mapper = mapperConfig.CreateMapper();
第三步:测试映射
现在你就可以正常映射了:
// 构造测试源对象 var sourceJob = new JoinedJob { job = new JobInfo { JobID = 123, JobType = "Contract" }, loc = new LocationInfo { /* 填充你的位置数据 */ } }; // 执行映射 var jobDetails = mapper.Map<JobDetailsModel>(sourceJob); // 现在jobDetails.JobID应该是123,JobType是"Contract"啦
为啥之前不工作?
AutoMapper默认不会自动遍历嵌套属性找同名字段,必须你明确告诉它要从哪个嵌套属性里取数据。如果你的目标字段命名是Job_JobID(下划线分隔嵌套层级),AutoMapper的扁平化约定会自动识别,但你的目标字段是JobID,所以必须显式配置。
另外,一定要记得调用AssertConfigurationIsValid(),它会帮你检查所有目标字段是否都有对应的源映射,避免运行时出现莫名其妙的空值或0值问题。
内容的提问来源于stack exchange,提问作者krisnds
相关产品推荐
相关产品推荐

