关于 change-tracking
介绍 EF Core 更改跟踪内部机制的开发技能,涵盖实体状态、快照、变更检测和标识映射。它为状态转换与图替换问题提供处理和测试指导。
主要功能
- 01受跟踪实体与状态管理
- 02快照及通知式变更检测
- 03标识映射与共享标识替换
- 04编译属性访问器
- 05单元测试与图更新测试指导
适用场景
- 01调试异常的实体状态转换
- 02测试基于快照的变更检测
- 03验证共享标识的替换图
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dotnet/ efcore --skill change-tracking安装后在 Claude Code 中输入/change-tracking确认已加载。
详细介绍
更改跟踪
管理实体状态并检测 SaveChanges() 的更改。
核心组件
StateManager— 管理被跟踪的条目、标识/引用映射、修正、级联、通知和更改计数InternalEntryBase及其派生类 — 管理每个条目的状态、标志、值、快照和有序状态转换ChangeDetector— 将当前值与基线进行比较,并通过条目变更 API 报告更改SnapshotFactoryFactory子类 — 创建被动的原始值和关系值基线IdentityMap— 确保每个键只有一个活动条目;共享标识会将替换条目与先前的Deleted条目配对PropertyAccessorsFactory、ClrPropertyGetterFactory和ClrPropertySetterFactory— 编译属性访问器,以高效创建快照并检测更改indices参数中的序号指定复杂集合每一层级的元素
更改检测
- 快照和通知策略都会调用
SetPropertyModified(),以保持属性标志与实体状态一致。 SetEntityState()会验证值、更新标志和复杂条目、更改状态,然后运行管理器的记账钩子。
共享标识替换
SharedIdentityEntry 是一项不变量,用于区分旧的已删除条目和具有相同标识的替换条目。附加替换图时,只有当某个已删除的嵌套条目的源条目存在替换项时,才应重新考虑该嵌套条目;不要宽泛地处理每个已删除节点。同样,从旧的替换前主体执行级联时,不得删除属于替换图的依赖项。保持同步和异步的图附加路径等效,并在替换测试中保留无关值,以便测试仅针对标识转换。
测试
单元测试:test/EFCore.Tests/ChangeTracking/。功能测试:test/EFCore.Specification.Tests/GraphUpdates/。
常见陷阱
| 陷阱 | 解决方案 |
|---|---|
| 基于状态的检查将每个 Added/Deleted 条目都视为替换项 | 通过 SharedIdentityEntry 和图源限定替换行为 |
验证
DetectChanges()通过快照比较识别已修改的属性- 设置原始值时,会根据与当前值的比较结果将属性标记为已修改或未更改
评论
支持 Markdown