EF Migrations: Rollback last applied migration?

405,786

Solution 1

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

Solution 2

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.

Solution 3

In EntityFrameworkCore:

Update-Database 20161012160749_AddedOrderToCourse

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

Solution 4

I realised there aren't any good solutions utilizing the CLI dotnet command so here's one:

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

In the place of NameOfYourMigration enter the name of the migration you want to revert to.

Then you can remove all the reverted migrations for good using

dotnet ef migrations remove

Solution 5

The solution is:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
Share:
405,786
Cristian Diaconescu
Author by

Cristian Diaconescu

Getting things done at scale. profile for Cristi Diaconescu on Stack Exchange, a network of free, community-driven Q&A sites http://stackexchange.com/users/flair/6794.png

Updated on July 05, 2021

Comments

  • Cristian Diaconescu
    Cristian Diaconescu almost 3 years

    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, like

    PM> Update-Database -TargetMigration:"-1"
    

    Instead, all I can come up with is:

    PM> Get-Migrations
    
    Retrieving migrations that have been applied to the target database.
    201208012131302_Add-SystemCategory
    201207311827468_CategoryIdIsLong
    201207232247409_AutomaticMigration
    201207211340509_AutomaticMigration
    201207200025294_InitialCreate
    
    PM> Update-Database -TargetMigration:"CategoryIdIsLong"
    

    (At least I can use just the name, skipping the timestamp...)

    Is there an easier way?