You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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);
} 

方案二:启用懒加载(适合频繁访问关联数据的场景)

如果项目经常需要访问实体关联数据,可启用懒加载:

  1. 在Hutang类中将HutangHistories改为virtual属性:
public virtual ICollection<HutangHistory> HutangHistories { get; } = new List<HutangHistory>();
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:55:24