使用EF Core迁移脚本修改数据库排序规则时遇错误求助
解决EF Core迁移修改数据库排序规则时的会话终止错误
问题原因
修改数据库排序规则的ALTER DATABASE语句会触发SQL Server强制终止当前会话并重置连接,而EF Core默认在同一个数据库连接中执行整个迁移的所有操作。当AlterDatabase执行完成后,后续的CreateTable操作会使用已失效的连接,从而引发登录失败、会话被终止的错误。
解决方案
方案1:拆分为两个独立迁移
将修改数据库排序规则和创建表的操作分开到两个迁移中,确保每个迁移使用全新的数据库连接:
- 第一个迁移(仅修改排序规则)
protected override void Up(MigrationBuilder migrationBuilder) { _ = migrationBuilder.AlterDatabase("SQL_Latin1_General_CP1_CS_AS"); }
执行该迁移后,SQL Server会重置连接,此时迁移流程正常结束。
- 第二个迁移(仅创建表)
创建新的迁移,将建表操作放入其中:
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"), }); }
- 依次执行迁移
先运行Update-Database执行第一个迁移,完成后再次运行Update-Database执行第二个迁移。
方案2:手动执行排序规则修改SQL
如果不想拆分迁移,可以手动执行排序规则修改语句,再让EF Core执行剩余迁移:
- 在SQL Server管理工具中执行(替换
YourDatabaseName为实际数据库名):
ALTER DATABASE YourDatabaseName COLLATE SQL_Latin1_General_CP1_CS_AS;
- 修改迁移代码,移除
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"), }); }
- 运行
Update-Database执行迁移。
内容的提问来源于stack exchange,提问作者Hardik Parmar
相关产品推荐
相关产品推荐

