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

.NET 6 EF Core连接SQL的API未返回嵌套对象问题排查

问题根因

关联数据返回空是核心行为逻辑差异导致的:

  • EF Core 默认不会自动加载关联表的导航属性数据,你当前的接口查询只读取了Request主表的数据,没有显式声明要关联加载RequestLines子集合,所以返回的Request对象里,RequestLines始终是类构造时初始化的空集合,根本没有执行关联查询去拉取对应的RequestLine数据。
  • Swagger能展示嵌套结构和实际查询逻辑无关,它是直接扫描实体类的属性定义生成的示例结构,不会校验你查询时有没有真的加载这部分数据。
  • 额外提个隐患:你现在的RequestLine实体类里,缺少FluentAPI映射配置中引用的Request引用导航属性,虽然不影响当前主表查子表的逻辑,但后续做反向查询或者EF Core模型校验的时候可能出异常。
修复方案

优先用显式Include加载(性能可控,是API场景的标准写法),直接修改GET接口的查询逻辑,加上Include指定要加载的子集合即可:

[HttpGet]
public async Task<ActionResult<IEnumerable<Request>>> GetRequests()
{
  if (_context.Requests == null)
  {
      return NotFound();
  }
    return await _context.Requests
        .Include(r => r.RequestLines) // 显式加载关联的RequestLines数据
        .ToListAsync();
}

改完重新编译调用接口,就能正常返回嵌套的RequestLine数据。如果后续有多级关联的需求,可以接着用ThenInclude往下接关联层级即可。

另外建议补上RequestLine里缺失的导航属性,避免后续出现映射错误:

public partial class RequestLine
{
    // 补上这个导航属性
    public virtual Request Request { get; set; } = null!;

    public long RequestId { get; set; }
    public int LineNumber { get; set; }
    public string Sku { get; set; } = null!;
    public string Batch { get; set; } = null!;
    public int Quantity { get; set; }
    public string? CostCentre { get; set; }
    public string? ProcessOrder { get; set; }
    public string Destination { get; set; } = null!;
    public DateTime FirstDeliveryDate { get; set; }
    public DateTime? SubmittedDate { get; set; }
    public DateTime? CancelDate { get; set; }
    public string? CancelBy { get; set; }
}

不推荐在API项目中开启懒加载代理:懒加载只要访问到导航属性就会自动发送SQL查询,列表接口场景下很容易触发N+1查询问题,导致接口性能骤降,没有特殊需求不要用。


内容的提问来源于stack exchange,提问作者SmithsonG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:27:17