问题
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?
回答1:
As of EF 5.0, the approach you describe is the preferred way. 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! http://entityframework.codeplex.com/
回答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.
回答3:
In EntityFrameworkCore:
Update-Database 20161012160749_AddedOrderToCourse
where 20161012160749_AddedOrderToCourse
is a name of migration you want to rollback to.
回答4:
The solution is:
Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
回答5:
Additional reminder:
If you have multiple configuration type, you need to specify the [ConfigurationName]
Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
回答6:
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.
回答7:
update-database 0
This will roll back all migrations in EFCore
回答8:
Update-Database –TargetMigration:"Your migration name"
For this problem I suggest this link:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
回答9:
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.
回答10:
I'm using EntityFrameworkCore and I use the answer by @MaciejLisCK. If you have multiple DB contexts you will also need to specify the context by adding the context parameter e.g. :
Update-Database 201207211340509_MyMigration -context myDBcontext
(where 201207211340509_MyMigration
is the migration you want to roll back to, and myDBcontext
is the name of your DB context)
回答11:
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
来源:https://stackoverflow.com/questions/11904571/ef-migrations-rollback-last-applied-migration