EntityFramework CoreでDBの状態を過去のマイグレーションに戻す。
概要
EntityFramework Coreで不要なテーブルを作成してしまったり変更を加えてしまったりしてしまい
元に戻す必要があったため、その手順メモです。
目次
環境
$ dotnet ef --info _/\__ ---==/ \\ ___ ___ |. \|\ | __|| __| | ) \\\ | _| | _| \_/ | //|\\ |___||_| / \\\/\\ Entity Framework Core .NET Command-line Tools 2.2.2-servicing-10034
前提
- ASP.NET Core MVCテンプレートの個人認証(Identity)付きプロジェクト
- DB接続プロバイダ
- Pomelo.EntityFrameworkCore.MySql Version:2.2.0
- 必要パッケージ
- Microsoft.EntityFrameworkCore.Design Version:2.2.2
参考サイト様
- c# - How to unapply a migration in ASP.NET Core with EF Core - Stack Overflow
- EF Core ツール リファレンス (.NET CLI) - EF Core | Microsoft Docs
- 移行 - EF Core | Microsoft Docs
手順
以下手順を.csproj
ファイルが存在するディレクトリで作業を実施する。
migration履歴を確認
dotnet ef migrations list
コマンドで過去のmigration一覧を確認します。
裏でビルドが走ってるようなので一覧表示まで少し時間がかかる。
$ dotnet ef migrations list
# ログ省略
20190302063727_init
20190304170151_consumer_key_table
現状20190304170151_consumer_key_table
時点の状態となっているが不要な変更であったため
20190302063727_init
時点の状態にDBを戻す作業となります。
DBの状態を指定した時点に戻す
dotnet ef database update <Migration Name>
で戻したい時点のMigrationを指定します。
こうすることでDBの状態が指定したMigration時点に戻ります。
$ dotnet ef database update 20190302063727_init
# ログ省略
Done.
これでDBの状態が20190304170151_consumer_key_table
の時点から20190302063727_init
に戻りました。
不要なMigrationの削除
完全に不要なので20190304170151_consumer_key_table
を削除します。
(不要と言うより今後、邪魔になるので。)
$ dotnet ef migrations remove # ログ省略 Removing migration '20190304170151_consumer_key_table'. Reverting model snapshot. Done.
トラブルシュート
dotnet ef migrations remove
するとエラー
現在適用されているmigrationをいきなり削除しようとするとエラーになる。
(migrationを削除することでdatabase update
も勝手にやってくれると思ってた。)
エラーは下記の通り。
$ dotnet ef migrations remove # ログ省略 The migration '20190304170151_consumer_key_table' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
回避策は上記で述べた手順で実行すれば良い。