EF Coreを使用してASP.NET Coreで移行を適用解除する方法


180

PM> Remove-Migration -context BloggingContextVS2015で、EF Coreを使用してASP.NET Coreプロジェクトで実行すると、次のエラーが発生します。

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

どうすれば適用を解除できますか?ASP.NET Core 1.0、EF Core、VS2015 Update 3の最新リリースを使用しています。


3
-force最後に追加してみてください
プロスペクター

1
記事learnentityframeworkcore.com/migrations#reversing-a-migrationで手順を説明しています。リンクをありがとう@drewskis
Michael Freidgeim 2018年

ありがとう@MichaelFreidgeim
Drewskis

回答:


215

使用する:

CLI

> dotnet ef database update <previous-migration-name>

パッケージマネージャーコンソール

PM> Update-Database <previous-migration-name>

例:

PM> Update-Database MyInitialMigration

次に、最後の移行を削除してみてください。

データベースに変更を適用したため、データベースを更新せずに移行を削除しても機能しません。

PMCを使用している場合、試してください:PM> update-database 0これによりデータベースがワイプされ、ソリューションの移行スナップショットを削除できるようになります


6
まだ同じエラーが発生します。私は最初にdotnet ef database update MyFirstMigration --context BloggingContextそれがうまくいったことを使いました。次にdotnet ef migrations remove --context BloggingContext、私の投稿と同じエラーメッセージが表示されて実行されました
nam

14
移行前に更新する必要がありますMyFirstMigration。これが最初の移行である場合(名前が示すとおり)、を使用dotnet ef database update 0して、データベースからすべての移行を元に戻す(適用を解除する)ことができます。その後、実行できるはずdotnet ef migrations removeです。
bvpb

また、日付のプレフィックスを除いて、移行の名前のみを使用する必要があることにも注意する必要があります
Structed

2
dotnet ef migrations removeこの後の電話
Chamika Sandamal

2番目のステートメント:「最後の移行を削除してみてください」はこの回答では完了していません。意味を正確に言ってください。移行ファイルを削除しますか?コマンドを実行しますか?...
S.Serpooshan 2018

125

すべての移行を完全に削除して最初からやり直すには、次の手順を実行します。

dotnet ef database update 0
dotnet ef migrations remove

1
ただし、すべての移行を削除する必要はありません。たとえば、VSがData \ Migrationsフォルダーの下のID(ユーザーアカウント)用に作成するデフォルトの移行を維持したいとします。
nam

知っておくと便利ですdotnet ef database update 0が、dotnet ef migrations remove後で実行すると、Identityのデフォルトの移行が削除されます。
kimbaudi 16

のヒントをありがとうdotnet ef database update 0!私はこれがどこにも言及されたことを見たことがありませんでした...
トビアスJ

3
@nam「しかし、すべてのマイグレーションを削除する必要はありません。」しかし、一部の人はそうします。私が欲しいものを想定しないでください:)
starmandeluxe

3
これは私にはうまくいきませんでした。最初の行は問題がなく、すべての移行を削除しました。2番目の行では、まだ取得していますThe migration '20180618103514_InitialMigration' 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.
Ido Ran

52

Update-Databaseコマンドは引き続き使用できます。

Update-Database -Migration <migration name> -Context <context name>

ただし、移行の名前で判断すると、コマンドが機能しない可能性があるため、これは最初の移行であると想定しています。__MigrationHistoryデータベースのテーブルからエントリを削除して、Remove-Migrationコマンドを再度実行できるはずです。移行ファイルを削除して、最初からやり直すこともできます。


Update-Databaseパッケージ管理コンソールdotnet ef database updateから呼び出すか、プロジェクトディレクトリからコマンドプロンプトから呼び出すことができます。
kimbaudi 2016

7
ここでのブラッドの答えを明確にするために- 元に戻したい移行の名前ではなく、戻り<migration name>たい移行の名前(つまり、失敗した移行のの移行)である必要があります。
マークアメリー2017年

52

特定の移行を適用解除するには

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

すべての移行を適用解除するには

dotnet ef database update 0
or
PM> Update-Database -Migration 0

最後の移行を削除するには:

dotnet ef migrations remove
or
PM> Remove-Migration

すべての移行を削除するには:

Migrationsフォルダを削除するだけです。

最後のいくつかの移行(すべてではない)を削除するには:

一連の移行を削除するコマンドはありません。スナップショットファイルを一貫した状態に保つ必要があるため、これらのファイルmigrationsとその*.designer.csファイルを削除することはできません。マイグレーションを1つずつ削除する必要があります(To remove last migration上記を参照)。

最後の移行を適用解除して削除するには:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

私はunapplyこれらの投稿の至る所で単語を見続けています。それはちょうど私に当たった、それは専門用語ではない、それは言葉だun - apply
ヘルツゲート

28

最後に適用した移行を元に戻すには(パッケージマネージャコンソールコマンド):

  1. データベースからの移行を元に戻す: PM> Update-Database <prior-migration-name>
  2. プロジェクトから移行ファイルを削除します(または次のステップで再度適用されます)
  3. モデルのスナップショットを更新: PM> Remove-Migration

UPD:2番目のステップは、最新バージョンのVisual Studio(2017)では必要ないようです。


1
ありがとうございました!これは誰も手順2の必要性に言及していないすべてのソリューションの完全に魅了されているうちに働いた
マイケルKargl

ええ、誰もステップ2について言及しませんでした。ありがとう
Aju

2番目のステップがわからない、私の場合(最新のVS2017)移行ファイルはRemove-Migration問題なく呼び出した後に自動的に削除されます。「次のステップで再度適用される」とはどういうことかわかりません。
S.Serpooshan 2018

@ S.Serpooshan確かに。手動で削除しましたが、Remove-Migrationを実行すると、以前の移行がデータベースに適用されていたというメッセージが表示されました。しかし、それは機能します。
MetalMikester 2018

2番目のステップdbContext.Database.Migrate()は、startup.cs を呼び出す場合にのみ必要だと思います
user3413723

23

単にマイグレーションを値でターゲットにできる

 Update-Database -Migration:0

次に、それを削除します

 Remove-Migration

1
これは私にとってはうまくいきましたが、VS2017でEFと.NETコア2.0を使用しています
James Morrison

2
注意:-Migration:0は、移行のない状態に戻ることを意味します。これによりデータベースがクリアされます
キーレンジョンストーン

質問に応じてはい。ロールバックする移行に応じて、値を増やすことができます
John Nyingi

11

移行がデータベースに既に適用された後で、ほとんど(最近?)の移行を「適用解除」するには:

  1. SQL Serverオブジェクトエクスプローラーを開きます(表示-> "SQL Serverオブジェクトエクスプローラー")
  2. 小さな三角形を横に展開して、プロジェクトにリンクされているデータベースに移動します。
  3. 「テーブル」を展開します
  4. 「dbo._EFMigrationsHistory」という名前のテーブルを見つけます。
  5. それを右クリックして[データの表示]を選択すると、Visual Studioのテーブルエントリが表示されます。
  6. 適用を解除する移行に対応する行を削除します(プロンプトが表示されたら、警告に対して「はい」と言ってください)。
  7. project.jsonファイルがあるディレクトリのコマンドウィンドウで、「dotnet ef migrations remove」を再度実行します。または、パッケージマネージャーコンソールで「Remove-Migration」コマンドを実行します。

これがプロジェクトのどの移行にも役立ち、適用できることを願っています...私はこれを最新の移行に対してのみテストしました...

幸せなコーディング!


21
これは実際には移行を適用解除せず、フレームワークが適用されていないことを「考える」だけにします。これを行うと、データベースは不整合な状態になります。
mark.monteiro 2017年

__EFMigrationsHistoryのデータを手動で編集するのはひどいアドバイスです。しないでください。このテーブルは、移行ツールが内部で使用することのみを目的としています。データの手動編集を開始した場合、1つの間違いがプロジェクトにさまざまな予期しない動作を引き起こす可能性があります。他の推奨される解決策の1つを使用することをお勧めします。
Joe Irby

ジュニアチームメンバーがブランチの切り替えで混乱し、両方から手動で移行を削除する状況がありました(ただし、すでに適用されているため、__ EFMigrationsHistoryテーブルにまだあります)ため、「ダウン」を失いました。これは私たちがやらなければならなかったことであり、それに加えてSSMSでのいくつかの手動の逆転です。したがって、この時点で他に選択の余地がない限り、それを行わないでください。少なくとも彼がしたことは、単一の新しいフィールドを追加することだけでした。
Ella、


10

'_EFMigrationsHistory'テーブルから移行'20160703192724_MyFirstMigration'レコード を削除する必要があります。

それ以外の場合、このコマンドは移行を削除し、移行フォルダーを削除します。

   > remove-migration -force

7

一般に、パッケージマネージャーコンソールを使用している場合、特定の移行を削除する正しい方法は、移行の名前を参照することです。

Update-Database -Migration {Name of Migration} -Context {context}

ドキュメントに従って適用した最後の移行を削除する別の方法は、次のコマンドを使用することです。

dotnet ef migrations remove

このコマンドは、ソリューションディレクトリ内の開発者コマンドプロンプト(コマンドプロンプトを開く方法)から実行する必要があります。

たとえば、アプリケーションが「Application」という名前の内部にあり、c:\ Projectsフォルダーにあるとします。次に、パスは次のようになります。

C:\Projects\Application

1
問題は、「dotnet ef migrations remove」が「移行はすでにデータベースに適用されている」というエラーを返す場合の
対処法でした

2

EF Core 1.0で移行を適用解除するには、次のコマンドを使用します。

dotnet efデータベースの更新{migration_name}

変更を保存するまでの移行の移行名を使用します。移行の名前のリストは、以下を使用して見つけることができます。

dotnet ef移行リスト


2

DBに適用されているすべての移行を元に戻すには、次のコマンドを実行します。

update-database 0

Remove-MigrationMigrationディレクトリに表示される移行ファイルがある限り、何回も実行する必要があります。このコマンドは、最新の移行を削除し、スナップショットも更新します。



0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1.テーブル「dbo._EFMigrationsHistory」を見つけて、削除する移行レコードを削除します。2. PM(Package Manager Console)で「remove-migration」を実行します。私のために働く。


これにより、データベースの不整合な状態が発生します(列が既に削除されているなど)
UNeverNo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.