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查询正常。
快速排查步骤
- 测试执行时先查询
_queryContext.RoundOccurrences,确认库中是否存在关联数据; - 检查SetUp代码,确保
RoundOccurrence实体被添加到context.RoundOccurrences并执行SaveChanges(); - 验证
TaskOccurrence的外键字段是否被正确赋值(比如RoundOccurrenceId = 5),而非仅依赖导航属性; - 检查EF关系配置,确认
TaskOccurrence与RoundOccurrence的关联是Optional(左外连接)还是Required(内连接)——如果是Required且库中无关联数据,Include后必然返回空。
内容的提问来源于stack exchange,提问作者Mateusz Kaleta
相关产品推荐
相关产品推荐

