You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为生产环境现有表添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:30:09