基于 EFCore 的 Interceptor 实现属性自动更新

💡 原文中文,约4800字,阅读约需12分钟。
📝

内容提要

基于EFCore的Interceptor实现自动更新属性。通过创建SaveChangesInterceptor来实现属性的自动更新。测试代码中新增和更新数据时未指定CreatedAt和UpdatedAt,但输出结果显示这两个字段已被更新。可以通过继承IEntityWithCreatedUpdatedAt接口和模式匹配来处理多个实体的情况。

🔎

延伸解读

拦截器实现机制

文章通过重写 SaveChangesInterceptor 的 SavingChanges 和 SavingChangesAsync 方法,在保存更改前遍历 ChangeTracker 中的实体。根据实体状态(Added 或 Modified)自动设置 CreatedAt 和 UpdatedAt 字段。这种方式将时间戳维护逻辑集中到拦截器中,避免了在业务代码中手动赋值的重复劳动。

多实体统一处理

当存在多个需要自动更新时间的实体时,可以定义一个包含 CreatedAt 和 UpdatedAt 属性的接口 IEntityWithCreatedUpdatedAt,让相关实体实现该接口。拦截器中通过模式匹配筛选出实现了接口的实体,从而统一处理,无需为每个实体类型编写重复代码。

注意事项与限制

拦截器仅对实现了 IEntityWithCreatedUpdatedAt 接口的实体生效,未实现的实体不会自动更新时间戳。此外,示例中使用 DateTimeOffset.Now 获取本地时间,若需统一时区或使用 UTC 时间,需自行调整。拦截器在每次 SaveChanges 时都会执行,需注意性能影响。

❓

Q&A

如何使用EFCore的Interceptor实现属性的自动更新?

通过创建SaveChangesInterceptor类,可以在保存更改时自动更新CreatedAt和UpdatedAt字段。

在EFCore中,如何处理多个实体的自动更新时间戳?

可以通过继承IEntityWithCreatedUpdatedAt接口和模式匹配来处理多个实体,避免重复代码。

SaveChangesInterceptor的主要功能是什么?

SaveChangesInterceptor的主要功能是在保存更改时自动更新实体的CreatedAt和UpdatedAt字段。

如何在EFCore中获取所有实体并更新时间戳?

使用ChangeTracker获取所有实体,并根据状态更新CreatedAt和UpdatedAt字段。

在测试代码中,如何验证CreatedAt和UpdatedAt字段的自动更新?

可以通过新增和更新数据后查询输出结果,验证CreatedAt和UpdatedAt字段是否被自动更新。

未实现IEntityWithCreatedUpdatedAt接口的实体会有什么影响?

未实现该接口的实体将不会自动更新时间戳。

➡️

继续阅读