エンティティフレームワークの移行のリセット


299

私は私のマイグレーションをマックアップしました、私は使用しました IgnoreChangesました。最初の移行でましたが、すべての移行を削除して、すべてのロジックした初期移行から始めたいと思います。

フォルダー内の移行を削除して試してAdd-Migrationも、完全なファイルが生成されない場合(空です-最後から変更を加えていないため、現在は移行を削除しています)。

あらゆるあります無効に-移行コマンドは、ので、私は再実行することができますかEnable-Migrations



3
複数の接続文字列がある場合の1つの重要な注意:移行をリセットするときにどちらを使用するかを指定してください。そうしないと、両方に適用しようとするため、矛盾がある場合に問題が発生する可能性があります。
Jeroen Vannevel 2014年

注:移行を削除していない場合(バージョン管理を使用していますか?)、db -toを更新してから、最初の移行で軽減策を削除し、その時点から新しい移行を作成できます。こちらをご覧ください:stackoverflow.com/a/23793384/309634
DarcyThomas

回答:


446

必要がある :

  1. 状態を削除します。プロジェクトのmigrationsフォルダーを削除します。そして
  2. __MigrationHistoryデータベースのテーブルを削除します(システムテーブルの下にある場合があります)。その後
  3. パッケージマネージャーコンソールで次のコマンドを実行します。

    Enable-Migrations -EnableAutomaticMigrations -Force

    の有無にかかわらず使用 -EnableAutomaticMigrations

  4. そして最後に、実行できます:

    Add-Migration Initial

5
^^わかりました-TFSエラーでした-TFSを使用している場合は、 "Enable-Migrations ..."コマンドを実行する前にチェックインを実行する必要があります。:D
BrainSlugs83 2013年

7
バージョン管理を使用していない場合は、削除する前にシード値を保存してください。
RyanJMcGowan 2013

77
@RyanJMcGowanバージョン管理を使用していない場合、作業を失うことに値します。:-)
マイクコール

4
@Tood。+1。多くの時間を節約できました。EFチームだけがすべてを移行のリセットコマンドに組み込むことができるとしたら。たぶんEF 6 ...
ジェラルドデイビス

24
既存のデータベースの場合、「Up」機能の内容をコメント化する必要があります。そうしないと、 "Update-Database"を実行したときにエラーが発生し、テーブルが既に存在するという
Guy

149

問題:移行をマックアップし、既存のテーブルを削除せずに移行をリセットしたい。

問題:EFは最初からテーブルを作成する必要があるため、データベース内の既存のテーブルを使用して移行をリセットできません。

何をすべきか:

  1. Migrations_Historyテーブルから既存のマイグレーションを削除します。

  2. 移行フォルダから既存の移行を削除します。

  3. add-migration Resetを実行します。これにより、テーブルの作成を含むMigrationフォルダーに移行が作成されます(ただし、実行されないため、エラーは発生しません)。

  4. 次に、EFが現在の状態のスナップショットを取得できるように、MigrationHistoryテーブルに最初の行を作成する必要があります。移行を適用すると、EFがこれを行います。ただし、テーブルがデータベースにすでに存在するため、作成した移行を適用することはできません。それで、Migrationに入り、 "Up"メソッド内のすべてのコードをコメント化してください。

  5. 次にupdate-databaseを実行します。Migrationを適用し(実際にはデータベースを変更しません)、MigrationHistoryにスナップショット行を作成します。

これで移行がリセットされ、通常の移行を続行できます。


11
これが私にとってうまくいった唯一の答えです。受け入れられた回答は、Update-Databaseを実行したり、アプリケーションを実行したりすると(使用しているイニシャライザの種類に応じて)何が起こるかという問題に対処していないようです。移行を実行し、既存の変更を加えようとします。私が何かを逃していない限り。
regularmike 14

2
それは、より柔軟な答えでもあります。私の場合、適用する必要のある変更と適用しない変更がありました。便利なものをUp()に保存するだけで済みます。
tec-goblin 2014

1
@H。ジョンソン、私はそれを見てきました。それについて質問がありましたか?
グレッグガム

2
EF 6.0以降の_MigrationsHistoryテーブルには、複数のDBContextの移行が含まれています。削除すると問題が発生する可能性があるため、ContextKey =移行名である行のみを削除する必要があります。また、上記2の後、移行を再度有効にする必要がありました
David Waterworth

2
(スクリーンショットで)展開例と本質的に同じ答え、weblog.west-wind.com/posts/2016/Jan/13/...
nmit026

30

いかがですか

Update-Database TargetMigration: $InitialDatabase

パッケージマネージャーコンソールで?すべての更新を非常に初期の状態にリセットする必要があります。

参照リンク:コードファーストの移行-特定のバージョンへの移行(ダウングレードを含む)


私の主な不満は、状態を正確に維持するためにマイグレーションを信頼することではなくなったと思います。その結果、ゼロから始めたいと思っています。
トッド14

@Todd、私はつまずきましたが、移行ファイルを削除して最初からやり直す必要があるかどうかは必ずしも明確ではありませんでした。これで次のように機能します。1. "Update-Database –TargetMigration:$ InitialDatabase"コマンドを使用して、初期状態に戻します。2.すべての移行ファイル(yyyyMMddHHmmssx_Name.csまたは.vbを使用して名前が付けられたファイル)を削除します。3. 'add-Migration -Name some_name'を使用して更新を更新します。4. 'update-Database'を使用して、データベースに影響を与える更新を発行します。それがあなたのために働くことを願っています。
Chris Voon、2014年

私の場合、この回答で提案されているコマンドの結果、SQLエラーが発生しました。
Justin Skiles

「InitialDatabase」とはどういう意味ですか?DBに既に作成されているテーブルまたは列を削除しますか?
セルジュ、

16

これを修正するには、次のことを行う必要があります。

  1. Migrationsフォルダー内のすべての* .csファイルを削除します。

  2. データベースの_MigrationHistoryテーブルを削除する

  3. 走る Enable-Migrations -EnableAutomaticMigrations -Force

  4. 走る Add-Migration Reset

次に、public partial class Reset : DbMigrationクラスで、既存のテーブルと現在のテーブルのすべてにコメントを付ける必要があります。

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

このビットを逃した場合、すべてが失敗し、もう一度開始する必要があります!

  1. 今すぐ実行 Update-Database -verbose

上記を正しく実行した場合、これは成功するはずです。これで、通常どおり続行できます。


2
すべてをコメントアウトする代わりに、「return」と書くこともできます。メソッドUp()の最初の行。
chainstair

6

これが.NET CoreでEFを検索するときに依然として表示されることを考慮して、ここに私の回答を投稿します(それは私を悩ませてきたためです)。EF 6 .NETバージョンにはいくつかの微妙な点があることに注意してください(最初のコマンドはなく、「スナップショット」ファイルを削除する必要があります)

(.NET Core 2.1でテスト済み)

手順は次のとおりです。

  1. _efmigrationhistoryテーブルを削除し ます。
  2. ソリューション全体を検索して、などの名前にスナップショットを含むファイルを探し、それらApplicationDbContextSnapshot.cs削除します。
  3. ソリューションを再構築する
  4. 走る Add-Migration InitialMigration

注意: スナップショットファイルはすべて削除する必要があります。。データベースを削除するだけで数え切れないほどの時間を費やしました...これを行わないと、空の移行が生成されます。

また、#3では、移行に任意の名前を付けることができます。

ここにいくつかの追加リソースがあります: asp.net CORE Migration生成された空

Entity Framework 7の移行をリセット


3

EntityFramework 6で試してください:

Add-Migration Initial

初期移行ファイルを更新するため。


3

Entity Framework Core内。

  1. 移行フォルダからすべてのファイルを削除します。
  2. コンソールに入力

dotnet efデータベースドロップ-f -v

dotnet ef migrations add Initial

dotnet efデータベースの更新


2

私の問題は、手動でMigrationsフォルダーを削除したことでした。コンテンツをバックアップしたかったのでそれを行いました。プロジェクトからフォルダーを単にドラッグしました。後で(バックアップコピーを作成した後に)元に戻し、ソリューションエクスプローラーで右クリックしてポップアップメニューから[削除]を選択してMigrationsフォルダーを削除することで、問題を修正しました。


1

EF6で

  1. 「migrations」フォルダ内のすべてのファイルを削除します...ただし、「initial create」または「config」は削除しません。
  2. データベースを削除します。
  3. 実行しAdd-Migration Initialます。
  4. これで「データベースの更新」ができるようになり、すべてが順調に進みます。

1

Migrationsフォルダを削除しCleanからRebuild、プロジェクトを削除します。これでうまくいきました。Clean and Rebuildの前に、キャッシュされたメモリにまだ移行が存在しないため、Migrationはすでに存在すると言っていました。


0

この方法では__MigrationHistoryテーブルを削除する必要がないため、デプロイ時にデータベースに手を置く必要はありません。

  1. Migrationsフォルダーから既存のマイグレーションを削除します。
  2. パッケージマネージャーコンソールで実行 Add-Migration ResetMigrations
  3. Up()メソッドの移行履歴を消去します。
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

Net Core 3.0の場合:

移行リセットする方法が見つからなかった

また、移行がうまくいかないという問題にも遭遇し、ここで提供された回答がうまくいきませんでした。私は.Net Core 3.0 Web APIを使用しており、先月のどこかでデータベースを直接編集しました。はい、私は悪い、悪いことをしました。

ここで提案されている戦略により、パッケージマネージャーコンソールでいくつかのエラーが発生しました。

  • その名前の移行はすでに存在します
  • スナップショットが見つかりませんでした
  • 「力」は認識されたパラメータではありません

確かに、私は一歩逃したか、正しいファイルを消去することに失敗した可能性がありますが、あまり力ずくでこれをクリーンアップする方法があることがわかりました。

  • 破損した移行を含め、作成とは逆の順序で、名前ごとに移行ごとにPMCから移行を削除
  • Add-Migrationは、最後の適切な移行から現在のスキーマまでの差分になる新しい移行を作成します

空のデータベースでWeb APIを起動すると、エンティティモデルに一致するすべてのテーブルとプロパティが正しく作成されるようになりました。

HTH!



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