如何配置EF Core 6 Identity模型启用Temporal Tables时态表
EF Core 6 为Identity内置表启用时态表的标准方案
不需要手动编写裸SQL,也不需要创建大量无意义的空继承类,直接利用EF Core的元模型API批量配置即可,这是EF Core原生支持的无冗余实现方式,生成的迁移逻辑和普通业务表配置时态表完全一致。
实现逻辑是在DbContext的OnModelCreating方法中,等Identity框架完成默认表映射初始化后,遍历所有Identity相关实体,统一应用时态表配置:
protected override void OnModelCreating(ModelBuilder builder) { // 必须先调用基类方法,完成Identity默认模型的初始化映射 base.OnModelCreating(builder); // 批量为所有Identity内置表启用时态表 foreach (var entityType in builder.Model.GetEntityTypes() .Where(e => e.GetTableName() != null && e.GetTableName()!.StartsWith("AspNet"))) { // 基础配置,使用默认历史表名、系统周期列名 builder.Entity(entityType.ClrType).ToTable(tb => tb.IsTemporal()); // 如果需要自定义配置,可以用下面的写法替换 // builder.Entity(entityType.ClrType).ToTable(tb => tb.IsTemporal(tempOpt => // { // tempOpt.UseHistoryTable($"{entityType.GetTableName()}History"); // tempOpt.HasPeriodStart("SysStartTime"); // tempOpt.HasPeriodEnd("SysEndTime"); // })); } }
两种备选方案的弊端
- 手动执行SQL方案:属于配置旁路,EF Core的迁移管线无法感知你手动开启的系统版本控制,后续表结构变更、迁移合并时很容易生成冲突脚本,维护成本高。
- 空类继承方案:完全冗余,只有当你需要给Identity实体扩展额外字段、自定义业务逻辑时,才需要派生自定义Identity实体类,仅为了配置表特性创建空类没有必要。
注意事项
配置完成后新增迁移,EF Core会自动生成时态表所需的周期字段、历史表、系统版本控制开启的完整SQL,不需要手动补充任何脚本。
如果你本身已经派生了
ApplicationUser这类自定义Identity实体,上述批量配置代码依然可以正常生效,只要确保批量配置的代码写在base.OnModelCreating(builder)调用之后即可,避免被Identity的默认配置覆盖。
内容的提问来源于stack exchange,提问作者ChrisHDog
相关产品推荐
相关产品推荐

