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

Entity Framework使用Include查询返回Null,数据库存在对应数据

问题原因分析与排查方向

针对你遇到的InMemory DbContext测试中Include失效的问题,结合场景推测以下核心原因:

1. 关联实体未被持久化到InMemory库

这是最常见的情况:
你在SetUp阶段仅将TaskOccurrences添加到上下文并保存,但关联的RoundOccurrence实体并未被添加到对应的RoundOccurrences DbSet中。

  • SetUp阶段用同一个上下文查询时,EF Core会通过内存跟踪的对象自动填充导航属性,所以能查到关联数据;
  • 测试阶段的_queryContext是新实例(或已脱离原跟踪上下文),查询时依赖InMemory库中的实际数据——由于RoundOccurrences库中无数据,若你的关系配置为内连接(比如RoundOccurrence是Required),EF会过滤掉所有找不到关联的TaskOccurrences,导致带Include的查询返回0条。

验证方法:在测试执行时先查_queryContext.RoundOccurrences.ToList(),如果结果为空,直接坐实这个问题。

2. 外键与关联配置不匹配

如果TaskOccurrence的外键字段(比如RoundOccurrenceId)未被正确赋值,或者EF的关系配置存在错误:

  • 比如你仅设置了导航属性TaskOccurrence.RoundOccurrence = round,但未手动赋值外键RoundOccurrenceId = 5,且EF的自动外键填充未生效;
  • 或者关系配置中,外键字段名称与实体属性不匹配(比如配置用RoundId,但实体中是RoundOccurrenceId),导致InMemory库中TaskOccurrences的外键值与RoundOccurrences的Id无法关联。

3. 上下文实例隔离问题

虽然你说不带Include能查到18条数据,说明数据是共享的,但仍需确认:SetUp阶段使用的DbContext与测试中的_queryContext是否使用了同一个InMemory数据库名称。InMemory数据库默认按实例隔离,只有指定相同名称才会共享数据。不过这个可能性较低,毕竟无Include查询正常。

快速排查步骤
  1. 测试执行时先查询_queryContext.RoundOccurrences,确认库中是否存在关联数据;
  2. 检查SetUp代码,确保RoundOccurrence实体被添加到context.RoundOccurrences并执行SaveChanges();
  3. 验证TaskOccurrence的外键字段是否被正确赋值(比如RoundOccurrenceId = 5),而非仅依赖导航属性;
  4. 检查EF关系配置,确认TaskOccurrence与RoundOccurrence的关联是Optional(左外连接)还是Required(内连接)——如果是Required且库中无关联数据,Include后必然返回空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:06:25