无法使用 Ef Core 删除数据库迁移

Posted

技术标签:

【中文标题】无法使用 Ef Core 删除数据库迁移【英文标题】:Can't remove Database Migration with Ef Core 【发布时间】:2020-07-09 21:52:10 【问题描述】:

好吧,我正在尝试恢复数据库迁移,只需添加一列,请参阅:

 public partial class CreateColumnTypeCamera : Migration
    
        protected override void Up(MigrationBuilder migrationBuilder)
        
            migrationBuilder.AddColumn<string>(
                name: "type",
                table: "CAMERA",
                type: "varchar",
                nullable: false,
                defaultValue: "");
        

        protected override void Down(MigrationBuilder migrationBuilder)
        
            migrationBuilder.DropColumn(
                name: "type",
                table: "CAMERA");
        
    

执行dotnet ef database update 后一切正常,我的数据库也更新了。但是我想还原它,所以我尝试了dotnet ef database update CreateColumnTypeCamera

[ronaldo@localhost WebApi]$ dotnet ef database update CreateColumnTypeCamera
Done.

如您所见,我得到了“完成”,但没有还原任何内容,也没有删除该列。如果我尝试删除我的迁移,则会收到错误消息:

[ronaldo@localhost WebApi]$ dotnet ef migrations remove
The migration '20200329134024_CreateColumnTypeCamera' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

编辑 1:

我将“更新”命令应用于“LastGoodMigration”,而不是我的错误迁移,一切正常。但是remove中的错误继续,所以我注意到这是因为这一行:

 if (Database.ProviderName != "Microsoft.EntityFrameworkCore.InMemory")
      
        Database.Migrate();
      

有什么办法可以解决吗?如果我尝试使用此行应用“ef remove”,则会收到上面显示的错误。

【问题讨论】:

这能回答你的问题吗? EF Migrations: Rollback last applied migration? 不满意,因为我使用的是 donet ef 工具而不是“包管理器”,在我的情况下,我只想回滚特定的迁移,我有这个名字。 重点是更新到previous迁移。并且“删除”从您的源代码中删除迁移,而不是从数据库中删除。所以这不是你想要的。 对不起,我没听懂。我应该在“CreateColumnTypeCamera”之前和删除它之后更新到迁移吗?我知道我需要删除对“CreateTypeCamera”的更新,并在删除它之后。 是的。先“更新”到 CreateColumnTypeCamera 之前的迁移。 【参考方案1】:

转到数据库,表 EF_migrations 并删除具有特定 ID(表行)的迁移,然后您可以从迁移文件夹中删除文件。不要忘记手动更新受此迁移影响的表。

【讨论】:

这个解决方案完全是手动的,这可行但不是一个好的选择,在我的选择中应该使用“dotnet ef 工具”。【参考方案2】:

你需要运行

update-database OneMigrationBeforeTheOneYouWantToRemove

将数据库更新到您要删除的数据库的先前迁移。这将恢复数据库上的更改,并从 _migrations 表中删除迁移。

之后就可以运行了:

Remove-Migration

这将删除最后一次迁移,您可以运行它 'n' 次,直到达到想要删除的迁移。

【讨论】:

以上是关于无法使用 Ef Core 删除数据库迁移的主要内容,如果未能解决你的问题,请参考以下文章

数据库更新后是不是可以删除 EF Core 数据库迁移

EF Core codefirst数据迁移

ef core数据迁移的一点小感悟

添加迁移EF Core时出现奇怪错误

如何删除一列并创建一个新列而不是在 EF Core 中重命名?

为什么EF Core无法自动生成ID字段?