EF Core多数据库提供者迁移问题:始终执行SQL Server脚本
我帮你梳理了这个EF Core多数据库提供者场景下的问题解决方案,这种情况在Code First模式里挺常见的,核心是迁移文件和数据库提供者的绑定关系没理清,导致默认走了SQL Server的迁移。下面是具体的排查和解决步骤:
EF Core的迁移文件是和特定数据库提供者强绑定的——因为不同数据库的SQL语法、数据类型映射都不一样,迁移文件里会包含对应提供者的专属代码。如果你的项目里同时存在两种迁移,又没明确指定要使用哪一套,就会出现选了MySQL却执行SQL Server迁移的情况。
1. 为不同数据库创建独立的迁移文件夹
首先要把SQL Server和MySQL的迁移文件彻底分开存放,避免混淆。用EF Core CLI命令分别生成对应数据库的迁移:
- 生成SQL Server迁移:
Add-Migration InitialCreate_SqlServer -Context YourDbContext -OutputDir Migrations/SqlServer - 生成MySQL迁移:
Add-Migration InitialCreate_MySql -Context YourDbContext -OutputDir Migrations/MySql
这样两套迁移文件会分别放在Migrations/SqlServer和Migrations/MySql目录下,互不干扰。
2. 配置DbContext时指定对应迁移
在项目启动类(Program.cs/Startup.cs)中,配置DbContext时要明确指定当前使用的数据库提供者,以及对应的迁移集合:
var connectionString = Configuration.GetConnectionString("MySqlConnection"); services.AddDbContext<YourDbContext>(options => { // 绑定MySQL提供者 options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); // 指定使用MySQL迁移所在的程序集和历史表(避免和SQL Server的历史表冲突) options.MigrationsAssembly(typeof(YourDbContext).Assembly.FullName); options.MigrationsHistoryTable("__EFMigrationsHistory", "your_database_schema"); });
注意:MySQL的迁移历史表默认结构和SQL Server略有差异,显式指定历史表名能避免潜在的冲突问题。
3. 执行迁移时明确指定目标迁移
执行Update-Database命令时,一定要指定对应的迁移名称和上下文,确保走的是MySQL的迁移:
- Package Manager Console命令:
Update-Database -Context YourDbContext -Migration InitialCreate_MySql - .NET CLI命令:
dotnet ef database update --context YourDbContext --migration InitialCreate_MySql
4. 检查CLI工具的默认配置
有时候EF Core CLI工具会默认读取SQL Server的连接配置,你可以在生成或执行迁移时强制指定提供者:
dotnet ef migrations add InitialCreate_MySql --provider MySql.EntityFrameworkCore --context YourDbContext --output-dir Migrations/MySql
5. 排查DbContext构造函数的硬编码
确保你的DbContext没有在构造函数里硬编码使用SQL Server,比如不要写:
// 错误示例:硬绑定SQL Server public YourDbContext(DbContextOptions<YourDbContext> options) : base(options) { options.UseSqlServer("..."); }
正确的做法是通过启动类的依赖注入来动态配置提供者,让DbContext保持中立。
执行完迁移后,你可以:
- 查看MySQL数据库中的
__EFMigrationsHistory表,确认里面的迁移记录是你生成的MySQL版本; - 打开MySQL的迁移文件,检查是否包含
MySqlMigrationBuilder相关的扩展方法(而不是SQL Server的SqlServerMigrationBuilder)。
内容的提问来源于stack exchange,提问作者pantonis

