在.NET Core 7中使用AutoMapper 12.0获取关联表数据的问题
问题分析与解决方案
你的问题核心在于两个关键点:EF Core未加载关联的HutangHistories集合,以及AutoMapper映射方法调用错误。
1. 为什么HutangHistories数据未被获取?
EF Core默认不启用懒加载,执行_dbContext.Hutangs.ToList()时只会查询Hutang主表数据,不会自动加载关联的HutangHistories集合。因此AutoMapper执行src.HutangHistories.Sum(...)时操作的是空集合,最终TotalHutang结果为0。
2. 映射方法调用错误
控制器中你使用_mapper.Map<HutangReadDto>(_dbContext.Hutangs.ToList()),这是把List<Hutang>映射成单个HutangReadDto,不符合返回IEnumerable<HutangReadDto>的需求,应映射为集合类型。
解决方案
方案一:显式加载关联数据(推荐,可控性强)
在查询时用Include方法强制EF Core加载关联的HutangHistories:
修改控制器GetHutangs方法:
[HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult<IEnumerable<HutangReadDto>> GetHutangs() { _logger.LogInformation("Menampilkan semua hutang"); // 显式加载关联的HutangHistories var hutangEntities = _dbContext.Hutangs.Include(h => h.HutangHistories).ToList(); // 映射为集合类型 var hutangs = _mapper.Map<IEnumerable<HutangReadDto>>(hutangEntities); return Ok(hutangs); }
方案二:启用懒加载(适合频繁访问关联数据的场景)
如果项目经常需要访问实体关联数据,可启用懒加载:
- 在
Hutang类中将HutangHistories改为virtual属性:
public virtual ICollection<HutangHistory> HutangHistories { get; } = new List<HutangHistory>();
- 在
ApplicationDbContext的OnConfiguring方法中启用懒加载代理:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLazyLoadingProxies(); // 你的数据库连接配置... }
方案三:使用AutoMapper ProjectTo优化性能(最佳实践)
ProjectTo可让AutoMapper直接在数据库层面计算Sum,无需加载所有HutangHistory数据到内存,大幅提升查询效率:
修改控制器代码:
[HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult<IEnumerable<HutangReadDto>> GetHutangs() { _logger.LogInformation("Menampilkan semua hutang"); // 直接在数据库层面完成映射与求和 var hutangs = _dbContext.Hutangs .ProjectTo<HutangReadDto>(_mapper.ConfigurationProvider) .ToList(); return Ok(hutangs); }
这种方式下,EF Core会生成包含SUM(Nominal)的SQL语句,仅返回所需DTO数据,性能最优。
内容的提问来源于stack exchange,提问作者Hafidz Fairiz
相关产品推荐
相关产品推荐

