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

EF Core删除Migrations文件夹后,如何保留数据库并继续更新?

保留数据前提下重新维护EF Core迁移的解决办法

针对你删除Migrations文件夹后,新建迁移重复生成已存在表CREATE语句导致ORA-00955错误的问题,按以下步骤操作即可恢复正常迁移流程且不丢失数据:

1. 建立基线迁移并标记数据库已完成该迁移

  • 生成包含当前所有实体模型的初始基线迁移:
    dotnet ef migrations add InitialBaseline
    
    这一步会生成包含现有所有表CREATE语句的迁移文件,不要直接执行dotnet ef database update,否则会触发表已存在的错误。
  • 手动往数据库的EFMIGRATIONSHISTORY表(Oracle注意大小写)插入该迁移的记录,让EF Core认为当前数据库结构已经匹配这个基线迁移:
    示例SQL(替换成你生成的迁移ID和EF Core版本号):
    INSERT INTO EFMIGRATIONSHISTORY (MigrationId, ProductVersion)
    VALUES ('20240520123456_InitialBaseline', '8.0.5');
    
    迁移ID就是生成的迁移文件名前缀,ProductVersion可从迁移文件的类代码里找到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:03:24