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. 手动执行完整迁移脚本
作为临时替代方案,生成完整的迁移脚本并直接执行:
- 本地生成迁移脚本:
dotnet ef migrations script --output migrations.sql --idempotent
- 在测试中读取脚本并执行:
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
相关产品推荐
相关产品推荐

