EF移行:最後に適用された移行をロールバックしますか?


434

これは非常に一般的な作業のように見えますが、簡単な方法が見つかりません。

最後に適用した移行を元に戻したい。私は次のような簡単なコマンドを期待していました

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

代わりに、私が思いつくことができるすべては:

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"

(少なくとも、タイムスタンプをスキップして名前だけを使用できます...)

もっと簡単な方法はありますか?


1
悲しいことに、ここに私たちは数年後、誰も実際に質問を読みませんでした。
ダニエルZA

回答:


160

EF 5.0以降では、説明するアプローチが推奨される方法です。そう

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

または移行例を使用して

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

1つの解決策は、上記の手順を自動化するラッパーPSスクリプトを作成することです。さらに、この機能のリクエストを自由に作成してください。実装する場合は、ぜひお試しください。https://github.com/dotnet/ef6


4
もう1つの詳細:手動で移行する必要がある既存の手動移行があるが、「Down」メソッドでは実際に適切にロールバックされないことに気付いた場合は、それを編集して保存し、update-database -targetを再実行します。 。適切にロールバックされるまで。事実の後で(すでに適用した後で)手動移行を変更しても、編集が許可されていないものにはなりません。
Chris Moschini、2013

1
これは私にはうまくいきません。私が得るすべては「指定されたターゲット移行 "-1"は存在しません
。– tutiplain

2
@tutiplain彼の2番目のコードブロックを見てください。あなたは彼が望んでいるものを引用し、存在するものを引用するのではありません。
シンジャイ

dotnetコマンドを使用してこれを行う正しい方法は何ですか?ドキュメントで見つけることができなかったか、何か不足しています。entityframeworktutorial.net/efcore/…で試してみました か?
Sijan Shrestha

私は解決策を見つけましたdotnet ef database update LastGoodMigrationが、ノードのバックグラウンドから来てknex、sequlizeを使用しているため、これは混乱しているようです。最後の変更を反映するコマンドがあり、データベースに適用された最後のアクションを元に戻すコマンドがあります。 ?
Sijan Shrestha

415

このスレッドにいくつかの説明を追加したいと思います:

Update-Database -TargetMigration:"name_of_migration"

上記で行っていることは、指定された移行が残されるまで、すべての移行をロールバックしたいということです。したがって、GET-MIGRATIONSを使用していて、A、B、C、D、およびEがあることがわかった場合、このコマンドを使用すると、EおよびDがロールバックされ、Cに移動します。

Update-Database -TargetMigration:"C"

また、反対にコメントできる人がいない限り、序数値と短い-Targetスイッチを使用できることに気づきました(したがって、-Targetは-TargetMigrationと同じです)。すべての移行をロールバックしてやり直す場合は、次のコマンドを使用できます。

Update-Database -Target:0

上記の0は、最初の移行でもロールバックします(これは破壊的なコマンドです-使用する前に何をしているかを確認してください!)-上記の構文を使用する場合、ターゲットマイグレーション(0番目のマイグレーションの名前は、マイグレーションが適用される前に存在しません!)したがって、その場合は、0(序数)値を使用する必要があります。同様に、マイグレーションA、B、C、D、およびEを(この順序で)適用した場合、序数1はAを参照し、序数2はBを参照する必要があります。したがって、Bにロールバックするには、次のいずれかを使用できます。

Update-Database -TargetMigration:"B"

または

Update-Database -TargetMigration:2

2019年10月を編集:

同様の質問に対するこの関連する回答によると、正しいコマンドは-TargetEF Core 1.1 -Migration用であり、EF Core 2.0用です。


27
インデックス0の移行の名前は$InitialDatabaseです。
MEMark

1
ありがとう。$ LatestDatabaseなど、他のインデックス位置を参照する$(name)値はありますか?
ジャジモフ2014

知りません。簡単なグーグルでは見つけられませんでした。多分EFのソースコードを閲覧するとそれらが明らかになるでしょうか?
MEMark

3
参考までに、これに遭遇し、OPと同じことをしようとしていました...これを使用ls variable:*する$InitialDatabaseと、PowerShell変数が0として定義されているように見えます。現在のEFソースコードでも、他の変数は定義されていません。そして、get-migrationsは何も返さず、コンソールに書き込むだけなので、返されたオブジェクトを反復することはできません...
DrewJordan

1
これが答えになるはずです
WtFudgE

75

ではEntityFrameworkCore

Update-Database 20161012160749_AddedOrderToCourse

どこ20161012160749_AddedOrderToCourseあなたがロールバックしたい移行の名前です。


2
宝石!この答えを見つけるのにしばらく時間がかかりました(.NET Core用に変更したため)。間違いなく賛成票に値する!
HockeyJ 2016年

4
日付/時刻を含める必要はありません。名前を入れるだけでOKです。
Richard Marskell-Drackir

1
これは私にとっては機能しません... "完了"と表示されますが、指定した後の移行はすべて残ります。そして、これらの移行の「ダウン」コードはどれも実行されていません。
egmfrs 2018年

そのような特定の移行に戻ることもできます。(つまり、Update-Database -Migration "Added Order to Course")
SwissCoder

13

解決策は次のとおりです。

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
これはすでに質問で述べられています、質問者はすでにこれを知っていました。これがどのように役立つかわかりませんが、それをもっと明確にすることができますか?
ANeves 16

この答えはより簡潔です。TYマックス!
andreikashin

4

追加のリマインダー:

複数の構成タイプがある場合は、[ConfigurationName]を指定する必要があります

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]

3

EF Core Remove-Migrationでは、誤った移行を追加した後で、パッケージマネージャーコンソールにコマンドを入力できます。

移行でデータの損失が発生する可能性がある場合は、コンソールでそうするように提案されています。

データが失われる可能性のある操作が足場で組まれました。移行の正確性を確認してください。このアクションを元に戻すには、Remove-Migrationを使用します。


3
update-database 0

警告:これにより、EFCoreのすべての移行がロールバックされます!注意して使用してください:)


2

これはパッケージマネージャーコンソールで実行すると機能することがわかりました。

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

それを簡単にするスクリプトを作成できます。


1

私はEntityFrameworkCoreを使用しており、@ MaciejLisCKによる回答を使用しています。複数のDBコンテキストがある場合は、コンテキストパラメータを追加して、コンテキストを指定する必要もあります。例:

Update-Database 201207211340509_MyMigration -context myDBcontext

(どこ201207211340509_MyMigrationにロールバックしたいマイグレーションmyDBcontextであり、DBコンテキストの名前です)



0

データ損失の可能性がある場合、EFはupdate-databaseコマンドを完了しません。デフォルトでは、AutomaticMigrationDataLossAllowed = falseであり、-forceパラメーターを指定して実行しない限り、アクションをロールバックします。

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

または

Update-Database TargetMigration:Your_Migration_Index -force
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.