.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
相关产品推荐
相关产品推荐

