Entity Framework rollback and remove bad migration

后端 未结 8 2271
[愿得一人]
[愿得一人] 2020-12-12 09:01

I\'m using EF 6.0 for my project in C# with manual migrations and updates. I have about 5 migrations on the database, but I realised that the last migration was bad and I do

相关标签:
8条回答
  • 2020-12-12 09:18

    You have 2 options:

    • You can take the Down from the bad migration and put it in a new migration (you will also need to make the subsequent changes to the model). This is effectively rolling up to a better version.

      I use this option on things that have gone to multiple environments.

    • The other option is to actually run Update-Database –TargetMigration: TheLastGoodMigration against your deployed database and then delete the migration from your solution. This is kinda the hulk smash alternative and requires this to be performed against any database deployed with the bad version.

      Note: to rescaffold the migration you can use Add-Migration [existingname] -Force. This will however overwrite your existing migration, so be sure to do this only if you have removed the existing migration from the database. This does the same thing as deleting the existing migration file and running add-migration

      I use this option while developing.

    0 讨论(0)
  • 2020-12-12 09:18

    I am using EF Core with ASP.NET Core V2.2.6. @Richard Logwood's answer was great and it solved my problem, but I needed a different syntax.

    So, For those using EF Core with ASP.NET Core V2.2.6 +...

    instead of

    Update-Database <Name of last good migration>
    

    I had to use:

    dotnet ef database update <Name of last good migration>
    

    And instead of

    Remove-Migration
    

    I had to use:

    dotnet ef migrations remove
    

    For --help i had to use :

    dotnet ef migrations --help
    
    
    Usage: dotnet ef migrations [options] [command]
    
    Options:
      -h|--help        Show help information
      -v|--verbose     Show verbose output.
      --no-color       Don't colorize output.
      --prefix-output  Prefix output with level.
    
    Commands:
      add     Adds a new migration.
      list    Lists available migrations.
      remove  Removes the last migration.
      script  Generates a SQL script from migrations.
    
    Use "migrations [command] --help" for more information about a command.
    

    This let me role back to the stage where my DB worked as expected, and start from beginning.

    0 讨论(0)
  • 2020-12-12 09:22

    For those using EF Core with ASP.NET Core v1.0.0 I had a similar problem and used the following commands to correct it (@DavidSopko's post pointed me in the right direction, but the details are slightly different for EF Core):

    Update-Database <Name of last good migration>
    Remove-Migration
    

    For example, in my current development the command became

    PM> Update-Database CreateInitialDatabase
    Done.
    PM> Remove-Migration
    Done.
    PM> 
    

    The Remove-Migration will remove the last migration you applied. If you have a more complex scenario with multiple migrations to remove (I only had 2, the initial and the bad one), I suggest you test the steps in a dummy project.

    There doesn't currently appear to be a Get-Migrations command in EF Core (v1.0.0) so you must look in your migrations folder and be familiar with what you have done. However, there is a nice help command:

    PM> get-help entityframework
    

    Refreshing dastabase in VS2015 SQL Server Object Explorer, all of my data was preserved and the migration that I wanted to revert was gone :)

    Initially I tried Remove-Migration by itself and found the error command confusing:

    System.InvalidOperationException: The migration '...' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

    There are already suggestions on improving this wording, but I'd like the error to say something like this:

    Run Update-Database (last good migration name) to revert the database schema back to to that state. This command will unapply all migrations that occurred after the migration specified to Update-Database. You may then run Remove-Migration (migration name to remove)

    Output from the EF Core help command follows:

     PM> get-help entityframework
                         _/\__
                   ---==/    \\
             ___  ___   |.    \|\
            | __|| __|  |  )   \\\
            | _| | _|   \_/ |  //|\\
            |___||_|       /   \\\/\\
    
    TOPIC
        about_EntityFrameworkCore
    
    SHORT DESCRIPTION
        Provides information about Entity Framework Core commands.
    
    LONG DESCRIPTION
        This topic describes the Entity Framework Core commands. See https://docs.efproject.net for information on Entity Framework Core.
    
        The following Entity Framework cmdlets are included.
    
            Cmdlet                      Description
            --------------------------  ---------------------------------------------------
            Add-Migration               Adds a new migration.
    
            Remove-Migration            Removes the last migration.
    
            Scaffold-DbContext          Scaffolds a DbContext and entity type classes for a specified database.
    
            Script-Migration            Generates a SQL script from migrations.
    
            Update-Database             Updates the database to a specified migration.
    
            Use-DbContext               Sets the default DbContext to use.
    
    SEE ALSO
        Add-Migration
        Remove-Migration
        Scaffold-DbContext
        Script-Migration
        Update-Database
        Use-DbContext
    
    0 讨论(0)
  • 2020-12-12 09:24

    As of .NET Core 2.2, TargetMigration seems to be gone:

    get-help Update-Database
    
    NAME
        Update-Database
    
    SYNOPSIS
        Updates the database to a specified migration.
    
    
    SYNTAX
        Update-Database [[-Migration] <String>] [-Context <String>] [-Project <String>] [-StartupProject <String>] [<CommonParameters>]
    
    
    DESCRIPTION
        Updates the database to a specified migration.
    
    
    RELATED LINKS
        Script-Migration
        about_EntityFrameworkCore 
    
    REMARKS
        To see the examples, type: "get-help Update-Database -examples".
        For more information, type: "get-help Update-Database -detailed".
        For technical information, type: "get-help Update-Database -full".
        For online help, type: "get-help Update-Database -online"
    

    So this works for me now:

    Update-Database -Migration 20180906131107_xxxx_xxxx
    

    As well as (no -Migration switch):

    Update-Database 20180906131107_xxxx_xxxx
    

    On an added note, you can no longer cleanly delete migration folders without putting your Model Snapshot out of sync. So if you learn this the hard way and wind up with an empty migration where you know there should be changes, you can run (no switches needed for the last migration):

    Remove-migration
    

    It will clean up the mess and put you back where you need to be, even though the last migration folder was deleted manually.

    0 讨论(0)
  • 2020-12-12 09:26

    First, Update your last perfect migration via this command :

    Update-Database –TargetMigration
    

    Example:

    Update-Database -20180906131107_xxxx_xxxx
    

    And, then delete your unused migration manually.

    0 讨论(0)
  • 2020-12-12 09:27

    You can also use

    Remove-Migration -Force
    

    This will revert and remove the last applied migration

    0 讨论(0)
提交回复
热议问题