EF Migrations: Rollback last applied migration?

后端 未结 15 1077
终归单人心
终归单人心 2020-12-02 03:39

This looks like a really common task, but I can\'t find an easy way to do it.

I want to undo the last applied migration. I would have expected a simple command, lik

相关标签:
15条回答
  • 2020-12-02 03:52

    As of EF 5.0, the approach you describe is the preferred way. So

    PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

    or using your example migrations

    PM> Update-Database -TargetMigration:"CategoryIdIsLong"

    One solution would be to create a wrapper PS script that automates the steps above. Additionally, feel free to create a feature request for this, or better yet, take a shot at implementing it! https://github.com/dotnet/ef6

    0 讨论(0)
  • 2020-12-02 03:52

    In case there is a possibility for dataloss EF does not complete the update-database command since AutomaticMigrationDataLossAllowed = false by default, and roolbacks the action unless you run it with the -force parameter.

    Update-Database –TargetMigration:"Your migration name" -force
    

    or

    Update-Database –TargetMigration:Your_Migration_Index -force
    
    0 讨论(0)
  • 2020-12-02 03:56

    I found that this works when run in the Package Manager Console:

    dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

    You could create a script that makes it easier.

    0 讨论(0)
  • 2020-12-02 04:00

    In EntityFrameworkCore:

    Update-Database 20161012160749_AddedOrderToCourse
    

    where 20161012160749_AddedOrderToCourse is a name of migration you want to rollback to.

    0 讨论(0)
  • In EF Core you can enter the command Remove-Migration in the package manager console after you've added your erroneous migration.

    The console suggests you do so if your migration could involve a loss of data:

    An operation was scaffolded that may result in the loss of data. Please review the migration for accuracy. To undo this action, use Remove-Migration.

    0 讨论(0)
  • 2020-12-02 04:02

    I want to add some clarification to this thread:

    Update-Database -TargetMigration:"name_of_migration"
    

    What you are doing above is saying that you want to rollback all migrations UNTIL you're left with the migration specified. Thus, if you use GET-MIGRATIONS and you find that you have A, B, C, D, and E, then using this command will rollback E and D to get you to C:

    Update-Database -TargetMigration:"C"
    

    Also, unless anyone can comment to the contrary, I noticed that you can use an ordinal value and the short -Target switch (thus, -Target is the same as -TargetMigration). If you want to rollback all migrations and start over, you can use:

    Update-Database -Target:0
    

    0, above, would rollback even the FIRST migration (this is a destructive command--be sure you know what you're doing before you use it!)--something you cannot do if you use the syntax above that requires the name of the target migration (the name of the 0th migration doesn't exist before a migration is applied!). So in that case, you have to use the 0 (ordinal) value. Likewise, if you have applied migrations A, B, C, D, and E (in that order), then the ordinal 1 should refer to A, ordinal 2 should refer to B, and so on. So to rollback to B you could use either:

    Update-Database -TargetMigration:"B"
    

    or

    Update-Database -TargetMigration:2
    

    Edit October 2019:

    According to this related answer on a similar question, correct command is -Target for EF Core 1.1 while it is -Migration for EF Core 2.0.

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