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

使用EF Core迁移脚本修改数据库排序规则时遇错误求助

解决EF Core迁移修改数据库排序规则时的会话终止错误

问题原因

修改数据库排序规则的ALTER DATABASE语句会触发SQL Server强制终止当前会话并重置连接,而EF Core默认在同一个数据库连接中执行整个迁移的所有操作。当AlterDatabase执行完成后,后续的CreateTable操作会使用已失效的连接,从而引发登录失败、会话被终止的错误。

解决方案

方案1:拆分为两个独立迁移

将修改数据库排序规则和创建表的操作分开到两个迁移中,确保每个迁移使用全新的数据库连接:

  1. 第一个迁移(仅修改排序规则)
protected override void Up(MigrationBuilder migrationBuilder)
{
    _ = migrationBuilder.AlterDatabase("SQL_Latin1_General_CP1_CS_AS");
}

执行该迁移后,SQL Server会重置连接,此时迁移流程正常结束。

  1. 第二个迁移(仅创建表)
    创建新的迁移,将建表操作放入其中:
protected override void Up(MigrationBuilder migrationBuilder)
{
    _ = migrationBuilder.CreateTable(
        name: "Employee",
        columns: table => new
        {
            Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
            EmployeeName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, collation: "LATIN1_GENERAL_CI_AI"),
        });
}
  1. 依次执行迁移
    先运行Update-Database执行第一个迁移,完成后再次运行Update-Database执行第二个迁移。

方案2:手动执行排序规则修改SQL

如果不想拆分迁移,可以手动执行排序规则修改语句,再让EF Core执行剩余迁移:

  1. 在SQL Server管理工具中执行(替换YourDatabaseName为实际数据库名):
ALTER DATABASE YourDatabaseName COLLATE SQL_Latin1_General_CP1_CS_AS;
  1. 修改迁移代码,移除AlterDatabase行,仅保留建表操作:
protected override void Up(MigrationBuilder migrationBuilder)
{
    _ = migrationBuilder.CreateTable(
        name: "Employee",
        columns: table => new
        {
            Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
            EmployeeName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, collation: "LATIN1_GENERAL_CI_AI"),
        });
}
  1. 运行Update-Database执行迁移。

内容的提问来源于stack exchange,提问作者Hardik Parmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:07:54