EF Core删除Migrations文件夹后,如何保留数据库并继续更新?
保留数据前提下重新维护EF Core迁移的解决办法
针对你删除Migrations文件夹后,新建迁移重复生成已存在表CREATE语句导致ORA-00955错误的问题,按以下步骤操作即可恢复正常迁移流程且不丢失数据:
1. 建立基线迁移并标记数据库已完成该迁移
- 生成包含当前所有实体模型的初始基线迁移:
这一步会生成包含现有所有表dotnet ef migrations add InitialBaselineCREATE语句的迁移文件,不要直接执行dotnet ef database update,否则会触发表已存在的错误。 - 手动往数据库的
EFMIGRATIONSHISTORY表(Oracle注意大小写)插入该迁移的记录,让EF Core认为当前数据库结构已经匹配这个基线迁移:
示例SQL(替换成你生成的迁移ID和EF Core版本号):
迁移ID就是生成的迁移文件名前缀,ProductVersion可从迁移文件的类代码里找到。INSERT INTO EFMIGRATIONSHISTORY (MigrationId, ProductVersion) VALUES ('20240520123456_InitialBaseline', '8.0.5');
2. 生成后续增量迁移
- 当你修改实体模型后,生成新的迁移:
此时生成的迁移只会包含模型变更的操作(新增列、修改约束等),不会再重复生成已存在表的dotnet ef migrations add [迁移名称,比如AddUserPhoneColumn]CREATE语句。 - 如果遇到Oracle不支持的语法(比如EF Core默认不生成
CREATE IF NOT EXISTS),可以手动编辑迁移文件,替换自动生成的代码为自定义SQL:
比如创建新表时用Oracle兼容的语法:protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.Sql(@" CREATE TABLE IF NOT EXISTS NewTable ( Id NUMBER(19,0) NOT NULL, Name VARCHAR2(255) NULL, CONSTRAINT PK_NewTable PRIMARY KEY (Id) ) "); }
3. 验证并执行迁移
- 先生成迁移脚本预览变更,确认没有重复创建表的语句:
dotnet ef migrations script InitialBaseline [新迁移名称] - 确认无误后执行迁移更新数据库:
dotnet ef database update
额外提示
- 如果数据库里没有
EFMIGRATIONSHISTORY表,先手动创建它:CREATE TABLE EFMIGRATIONSHISTORY ( MigrationId VARCHAR2(150) NOT NULL, ProductVersion VARCHAR2(32) NOT NULL, CONSTRAINT PK_EFMIGRATIONSHISTORY PRIMARY KEY (MigrationId) ); - 每次生成迁移后务必先预览脚本,避免误操作破坏现有数据。
内容的提问来源于stack exchange,提问作者SuperNev
相关产品推荐
相关产品推荐

