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

Docker部署SQL Server集成测试中EF Core单次仅应用一个迁移的问题

问题:EF Core Migrate() 每次仅应用单个迁移(Docker SQL Server 集成测试场景)

可能的排查与解决步骤

1. 验证迁移历史表与依赖关系

  • 登录Docker中的SQL Server,查看__EFMigrationsHistory表,确认每次执行Migrate()后是否仅新增一条记录。如果是,说明EF Core认为每次只有一个迁移待执行,检查每个迁移类的Up方法是否正确依赖前序迁移,或者迁移文件的生成是否存在顺序问题。
  • 执行GetPendingMigrations(),在每次Migrate()前后打印结果,确认待执行迁移列表是否正确更新。

2. 延长SQL Server就绪等待时间

虽然WaitForConnection()能确认连接成功,但SQL Server可能尚未完全初始化完成(比如后台服务未就绪),导致迁移执行不完整。可以在连接成功后添加额外等待:

_rawDbAccess.WaitForConnection();
Thread.Sleep(TimeSpan.FromSeconds(10)); // 根据实际情况调整时长
_componentUnderTest.Database.Migrate();

或者通过查询SQL Server状态确认就绪:

using var connection = new SqlConnection(_rawDbAccess.ConnectionString);
connection.Open();
var command = connection.CreateCommand();
command.CommandText = "SELECT DATABASEPROPERTYEX('YourDatabaseName', 'Status')";
var status = command.ExecuteScalar().ToString();
while (status != "ONLINE")
{
    Thread.Sleep(TimeSpan.FromSeconds(2));
    status = command.ExecuteScalar().ToString();
}

3. 捕获EF Core迁移日志

开启EF Core的迁移日志,查看执行过程中的细节,是否存在静默失败或跳过的情况:
在DbContext的配置中添加日志输出:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.LogTo(Console.WriteLine, Microsoft.Extensions.Logging.LogLevel.Information);
}

执行测试时观察控制台输出,确认每个迁移的SQL脚本是否被执行,是否有异常被吞掉。

4. 确保DbContext实例的正确性

检查_componentUnderTest是否在WaitForConnection()之后被重新创建或Dispose。如果DbContext实例在连接等待后被重新初始化,可能导致迁移状态未同步,建议在等待连接后重新获取DbContext实例再执行Migrate()。

5. 手动执行完整迁移脚本

作为临时替代方案,生成完整的迁移脚本并直接执行:

  1. 本地生成迁移脚本:
dotnet ef migrations script --output migrations.sql --idempotent
  1. 在测试中读取脚本并执行:
using var connection = new SqlConnection(_rawDbAccess.ConnectionString);
connection.Open();
var script = File.ReadAllText("migrations.sql");
var command = connection.CreateCommand();
command.CommandText = script;
command.ExecuteNonQuery();

6. 调整Docker容器资源限制

旧MacBook Pro的资源可能不足,导致SQL Server在Docker中运行时性能受限,迁移执行中断。启动容器时添加资源限制:

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -e "MSSQL_PID=Express" -p 60001:1433 --name sql_test --memory 2g --cpus 2 -d mcr.microsoft.com/mssql/server:2019-latest

7. 升级EF Core版本

尝试将EF Core及相关SQL Server包升级到6.x系列的最新稳定版本(如6.0.25),排查是否为特定版本的bug导致的迁移异常。


内容的提问来源于stack exchange,提问作者Paul Kertscher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:45:31