EF Core 6中AutoInclude(false)仍加载导航属性的问题解析
问题解答
1. 同一DbContext下导航属性仍被加载的原因
当你在同一个DbContext实例中先插入包含Dependant的Principal,后续查询该Principal时,EF Core的变更跟踪器已经持有了之前插入的Principal及其关联的Dependant实例。此时查询返回的是变更跟踪器中已存在的实体对象,导航属性会直接使用已加载的数据,不会重新执行查询去判断是否自动包含,所以Dependants集合不为空。
2. 迁移文件为空但模型快照变化是否正常
这是正常的。AutoInclude属于EF Core的查询行为配置,不属于数据库结构的变更(比如表、列、约束这些)。迁移只负责同步数据库结构,所以不会生成迁移文件;而模型快照会记录所有模型配置的变更,包括查询行为相关的设置,因此模型快照会有变化。
3. EF识别同一实体自动填充导航属性的行为说明
EF Core的变更跟踪器会跟踪所有由当前上下文实例加载或创建的实体。当你通过查询获取一个实体时,变更跟踪器会先检查是否已经存在具有相同主键的实体实例:
- 如果存在,直接返回该实例,并且该实例上已加载的导航属性会被保留(包括之前手动或通过插入操作加载的关联数据)。
- 如果不存在,才会从数据库查询数据,并根据
AutoInclude(false)的配置决定是否加载导航属性。
这是EF Core变更跟踪器的核心行为,官方文档明确说明变更跟踪器会维护实体的唯一性,确保同一上下文内同一主键的实体只有一个实例,同时自动管理实体间的关联状态。
内容的提问来源于stack exchange,提问作者jeancallisti
相关产品推荐
相关产品推荐

