如何用AutoMapper映射多层嵌套实体的属性?
解决AutoMapper多层嵌套实体映射失效问题
针对你遇到的多层嵌套属性映射失效问题,可按以下步骤排查修复:
1. 处理空引用(最常见原因)
如果映射链中任意对象(src.Mangueira 或 src.Mangueira.Fabricante)为null,会导致无法获取RazaoSocial。修改映射配置,添加空条件运算符(?.)避免空引用,同时正确传递null值:
cfg.CreateMap<MangueiraDaOrdemDeServico, MangueiraDaOrdemDeServicoDTO>() .ForMember(dest => dest.FabricanteNome, opt => opt.MapFrom(src => src.Mangueira?.Fabricante?.RazaoSocial));
2. 确认继承关系的映射配置
由于Mangueira继承自Equipamento,需确保AutoMapper能识别子类映射:
- 如果
MangueiraDaOrdemDeServico中的Mangueira属性是Equipamento类型,需在Equipamento的映射配置中包含子类:
// 假设存在Equipamento对应的DTO类 cfg.CreateMap<Equipamento, EquipamentoDTO>() .Include<Mangueira, MangueiraDTO>(); cfg.CreateMap<Mangueira, MangueiraDTO>();
3. 验证映射配置合法性
在应用启动时添加配置验证,快速定位配置错误:
// 初始化mapper后执行 mapper.ConfigurationProvider.AssertConfigurationIsValid();
如果存在未配置的属性或类型不匹配,会直接抛出异常提示问题。
4. 检查属性访问权限
确保以下属性均为public访问级别:
MangueiraDaOrdemDeServico.MangueiraEquipamento.Fabricante(或Mangueira.Fabricante)Fabricante.RazaoSocial
AutoMapper默认仅能访问公共成员,私有/保护成员无法被映射。
5. 手动测试映射逻辑
创建测试数据验证映射是否正常工作:
// 构造测试实体 var fabricante = new Fabricante { RazaoSocial = "示例厂商" }; var mangueira = new Mangueira { Fabricante = fabricante }; var ordemServico = new MangueiraDaOrdemDeServico { Mangueira = mangueira }; // 执行映射 var dto = mapper.Map<MangueiraDaOrdemDeServicoDTO>(ordemServico); // 检查结果 Console.WriteLine(dto.FabricanteNome); // 应输出"示例厂商"
如果测试正常,说明问题出在实际业务数据的空引用或加载问题(比如EF Core未Include关联数据)。
内容的提问来源于stack exchange,提问作者Guilherme Costa
相关产品推荐
相关产品推荐

