【问题标题】:Can't remove Database Migration with Ef Core无法使用 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 之前的迁移。

标签: entity-framework .net-core entity-framework-migrations


【解决方案1】:

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

【讨论】:

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

你需要运行

update-database OneMigrationBeforeTheOneYouWantToRemove

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

之后就可以运行了:

Remove-Migration

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

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2018-06-19
    • 2019-08-03
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多