EF Core结合AutoMapper查询时返回的子对象始终为null怎么解决
问题根本原因
ProjectTo扩展是通过表达式树直接生成SQL查询,不需要也不识别手动添加的Include语句,所以你之前尝试的Include完全不会生效。- 你配置的
MapFrom(src => src.ChildBundleId)属于错误配置,目标属性是BundleMetaDataDto对象,用Guid类型的外键赋值必然返回null。 - AutoMapper默认会阻止同类型的递归映射,避免出现无限循环嵌套的问题,你之前的
MaxDepth(2)如果没有加到对应映射规则上,就不会生效。
修复步骤
- 先删除所有错误的映射配置,使用以下正确的映射规则,显式指定递归深度:
cfg.CreateMap<Bundle, BundleMetaDataDto>() // 配置最大递归深度为2,仅嵌套一层子对象,避免无限循环 .MaxDepth(2); // 同名属性默认会自动匹配,不需要额外写MapFrom规则,有特殊需求再加
- 简化查询代码,删除多余的
Include语句:
var bundles = context.Bundles .Where(bundle => bundle.ChildBundle != null) .ProjectTo<BundleMetaDataDto>(EntityConverter.MapperConfiguration) .ToArray();
问题排查
如果按照上述配置后还是返回null,可以用以下方法定位问题:
- 输出生成的SQL语句,检查是否有对ChildBundle对应表的关联查询,没有的话说明映射配置未生效,检查
MapperConfiguration的注入/加载逻辑是否正确。 - 先手动查询实体再映射,确认实体本身能拿到ChildBundle数据:
var entities = context.Bundles .Include(b => b.ChildBundle) .Where(b => b.ChildBundle != null) .ToList(); var dtos = EntityConverter.Mapper.Map<List<BundleMetaDataDto>>(entities);
如果这个方式能拿到ChildBundle值,就说明问题出在ProjectTo的投影配置上,优先检查AutoMapper版本是否和EFCore 3.1兼容,建议使用AutoMapper 10.x的稳定版。
内容的提问来源于stack exchange,提问作者CaptTwigg
相关产品推荐
相关产品推荐

