mcpField
C
change-tracking

change-tracking

github.com/dotnet开发14.8k48 次安装今天更新
代码仓库

关于 change-tracking

介绍 EF Core 更改跟踪内部机制的开发技能,涵盖实体状态、快照、变更检测和标识映射。它为状态转换与图替换问题提供处理和测试指导。

主要功能

  1. 01受跟踪实体与状态管理
  2. 02快照及通知式变更检测
  3. 03标识映射与共享标识替换
  4. 04编译属性访问器
  5. 05单元测试与图更新测试指导

适用场景

  1. 01调试异常的实体状态转换
  2. 02测试基于快照的变更检测
  3. 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