为生产环境现有表添加Temporal Table遇配置失效问题
EF Core添加时态表配置后迁移不生效的原因分析
迁移未正确执行
先确认Update-Database命令是否成功完成,查看控制台输出有没有报错(比如权限不足、表被锁定等)。再检查数据库中的__EFMigrationsHistory表,确认对应的迁移记录已存在——如果没有,说明迁移根本没被执行。EF Core版本不支持
时态表是EF Core 3.0及以上版本才引入的功能,若项目使用的Microsoft.EntityFrameworkCore.SqlServer包版本低于3.0,配置不会生效。直接查看项目依赖包的版本号即可验证。配置被后续代码覆盖
检查DbContext的OnModelCreating方法,或者其他针对Line实体的配置代码,是否在builder.ToTable(b => b.IsTemporal())之后,又调用了不带时态配置的builder.ToTable("Lines")。这种情况下,后续的ToTable会覆盖之前的时态表设置。自动生成的迁移脚本缺失关键逻辑
有时候EF Core无法自动检测到“将现有表转为时态表”的变更,生成的迁移脚本里不会包含添加PeriodStart/PeriodEnd字段、启用系统版本控制的SQL。此时需要手动补全迁移代码:protected override void Up(MigrationBuilder migrationBuilder) { // 添加时态字段 migrationBuilder.AddColumn<DateTime>( name: "PeriodStart", table: "Lines", type: "datetime2", nullable: false, defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); migrationBuilder.AddColumn<DateTime>( name: "PeriodEnd", table: "Lines", type: "datetime2", nullable: false, defaultValue: new DateTime(9999, 12, 31, 23, 59, 59, 999, DateTimeKind.Unspecified)); // 启用系统版本控制并关联历史表 migrationBuilder.Sql(@" ALTER TABLE [Lines] ADD PERIOD FOR SYSTEM_TIME ([PeriodStart], [PeriodEnd]); ALTER TABLE [Lines] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[LinesHistory])); "); } protected override void Down(MigrationBuilder migrationBuilder) { // 关闭系统版本控制 migrationBuilder.Sql(@" ALTER TABLE [Lines] SET (SYSTEM_VERSIONING = OFF); DROP TABLE [dbo].[LinesHistory]; "); // 删除时态字段 migrationBuilder.DropColumn( name: "PeriodStart", table: "Lines"); migrationBuilder.DropColumn( name: "PeriodEnd", table: "Lines"); }数据库兼容性级别不足
SQL Server时态表要求数据库兼容性级别至少为130(对应SQL Server 2016及以上版本)。用以下SQL检查当前级别:SELECT name, compatibility_level FROM sys.databases WHERE name = '你的数据库名';若级别低于130,执行以下命令升级:
ALTER DATABASE 你的数据库名 SET COMPATIBILITY_LEVEL = 130;
内容的提问来源于stack exchange,提问作者Killnine
相关产品推荐
相关产品推荐

