EF Core未创建MigrationsHistory表,如何解决及补全迁移历史?
EF Core __EFMigrationsHistory表缺失问题处理
一、表缺失的常见原因
- 初始迁移创建时使用了
--no-migrations-history参数,跳过了历史表生成逻辑 - 手动移除了首个迁移文件中创建__EFMigrationsHistory表的代码片段
- 配置了自定义迁移历史提供器,但未正确初始化表结构
- 使用
Database.EnsureCreated()初始化数据库,该方法不会生成或依赖迁移历史表
二、手动创建__EFMigrationsHistory表
根据数据库类型执行对应SQL:
SQL Server
CREATE TABLE [__EFMigrationsHistory] ( [MigrationId] nvarchar(150) NOT NULL, [ProductVersion] nvarchar(32) NOT NULL, CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId]) );
MySQL/MariaDB
CREATE TABLE `__EFMigrationsHistory` ( `MigrationId` varchar(150) NOT NULL, `ProductVersion` varchar(32) NOT NULL, PRIMARY KEY (`MigrationId`) );
PostgreSQL
CREATE TABLE "__EFMigrationsHistory" ( "MigrationId" character varying(150) NOT NULL, "ProductVersion" character varying(32) NOT NULL, CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId") );
三、为已有的3个迁移填充历史记录
- 打开每个迁移文件,复制类顶部的
MigrationId值(如20240501120000_InitialSetup) - 确认项目引用的EF Core版本号(可查看NuGet包版本,如
8.0.3) - 执行插入语句,将每个迁移的信息写入历史表:
INSERT INTO __EFMigrationsHistory (MigrationId, ProductVersion) VALUES ('20240501120000_InitialSetup', '8.0.3'), ('20240502140000_AddCustomerTable', '8.0.3'), ('20240503160000_AddOrderTable', '8.0.3');
替换为你实际的MigrationId和EF Core版本
四、解决script-migration执行失败问题
先完成历史表的创建和已有迁移记录的填充,再重新运行script-migration,此时生成的脚本仅包含未应用的迁移逻辑。若需生成包含历史表创建的完整初始化脚本,可执行:
dotnet ef migrations script 0
该命令会生成从空数据库到最新迁移的全量脚本,包含__EFMigrationsHistory表的创建语句。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

