[C#] Entity Frameworkのロールバックと悪いマイグレーションの除去


Answers

問題は、まだリリースされていない開発タイプ環境での移行にも適用されることを示しています。

この問題は、次の2つの手順で解決できます。まず、データベースを最後の正常な移行に復元し、次に不正な移行をEntity Frameworkプロジェクトから削除します。

手順1:以前の移行に復元する

以前のポイントにデータベーススキーマを復元するには、以下を使用します。

Update-Database –TargetMigration: <name of last good migration>

最後の正常な移行を指定します。 まだ移行を適用していない場合は、この部分をスキップできます。

データベースに適用されている移行名のリストを取得するには、Get-Migrationsコマンドを使用します。

PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201508242303096_Bad_Migration
201508211842590_The_Migration_applied_before_it
201508211440252_And_another

このリストには、適用された最新の移行が最初に表示されます。 ダウングレードするグループ、つまりダウングレードするグループの前に適用されているグループのリストの後ろにある移行を選択します。

Update-Database –TargetMigration: "<the migration applied before it>"

指定した移行後に適用されるすべての移行は、最初に適用された最新の移行から順番にダウングレードされます。

手順2:プロジェクトからの移行を削除する

これで、EFプロジェクトのMigrationsフォルダから悪いマイグレーションを削除できます。

Question

C#で私のプロジェクトにEF 6.0を使用しています。手動の移行と更新があります。 私はデータベース上で約5回のマイグレーションを行っていますが、最後のマイグレーションが悪いことに気がつきました。 以前の移行にロールバックすることはできますが、新しい(固定)移行を追加してUpdate-Databaseを実行すると、悪い移行が適用されても適用されます。

以前の移行にロールバックし、悪い移行でファイルを削除しようとしていました。 しかし、新しいマイグレーションを追加しようとすると、マイグレーションファイルが破損しているため、データベースを更新するときにエラーが発生します(具体的には、最初の行のコードはテーブルAの名前をBに変更し、次の行です。名前A - 多分EFバグです)。

私が実行できるクエリがいくつかあります。これはEFに「それが決して存在しなかったような最後のマイグレーションを忘れて、それは悪い」のようなものです。 Remove-Migrationのようなもの。

Edit1私に合った解決策を見つけました。 モデルを良い状態に変更し、 Add-Migration TheBadMigration -Forceを実行しますAdd-Migration TheBadMigration -Force 。 これにより、適用された移行ではなく最後のものが再構築されます。

とにかく、これはまだ元の質問に完全に答えるものではありません。 私がUpdateDatabaseを悪いマイグレーションにすると、悪いマイグレーションをロールバックして新しいマイグレーションを作成する方法がわかりませんでした。

ありがとう




EF 6の場合、開発の足場を再構築しているなら、ここには1つのライナーがあります。 varsを更新し、パッケージマネージャーのコンソールで上向きの矢印を使用してリンスし、繰り返してください。

$lastGoodTarget = "OldTargetName"; $newTarget = "NewTargetName"; Update-Database -TargetMigration "$lastGoodTarget" -Verbose; Add-Migration "$newTarget" -Verbose -Force

これはなぜあなたが尋ねる必要があるのですか? どのバージョンのEF6が当てはまるのか分かりませんが、新しいマイグレーションターゲットがすでに適用されている場合は、 '-Force'を使ってAdd-Migrationで再スキャフォールドしても実際には再スキャフォールドされませんが、新しいファイルが作成されますあなたがあなたの 'ダウン'を失いたくないからだが)。 上記のスニペットは、必要に応じて 'Down'を最初に行い、その後、 - フォースは、適切に再足場を働かせます。