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

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

これは非常に一般的なタスクのように見えますが、それを実行する簡単な方法が見つかりません。

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

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

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

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 用ですが、-MigrationEF Core 2.0 用でもあります。

おすすめ記事