この質問はデータを気にしないことを前提としていますが、データのメンテナンスが不可欠な場合もあります。
もしそうなら、データベースに同じ名前のテーブルが既にある場合にEntity Frameworkの悪夢から回復する方法の手順のリストをここに書きました:Entity Frameworkの悪夢から回復する方法-データベースにはすでに同じ名前のテーブルがあります
どうやら...モデレーターは私の投稿を削除するのに適していると思ったので、ここに貼り付けます:
Entity Frameworkの悪夢から回復する方法-データベースにはすでに同じ名前のテーブルがあります
説明:チームがEFを初めて使用するときに私たちと同じである場合、新しいローカルデータベースを作成できないか、運用データベースに更新を適用できない状態になります。クリーンなEF環境に戻って基本に固執したいのですが、それはできません。本番環境で動作させると、ローカルデータベースを作成できません。ローカルで動作させると、本番サーバーの同期が取れなくなります。そして最後に、運用サーバーのデータを削除したくありません。
症状:Update-Databaseを実行できません。作成スクリプトを実行しようとしているため、データベースに同じ名前のテーブルが既に存在します。
エラーメッセージ:System.Data.SqlClient.SqlException(0x80131904):データベースに ''という名前のオブジェクトが既に存在します。
問題の背景:EFは、dbo .__ MigrationHistoryと呼ばれるデータベース内のテーブルに基づいて、コードがどこにあるかと比較して、現在のデータベースがある場所を理解します。移行スクリプトを見ると、スクリプトで最後に行った場所を再調整しようとします。できない場合は、順番に適用しようとします。つまり、最初の作成スクリプトに戻り、UPコマンドの最初の部分を見ると、エラーが発生していたテーブルのCreeateTableになります。
これをさらに詳しく理解するには、https://msdn.microsoft.com/en-us/library/dn481501(v = vs.113).aspxで参照されている両方のビデオを視聴することをお勧めし
ます。
解決策:EFをだまして、これらのCreateTableコマンドを適用していないときに現在のデータベースが最新であると考えるようにする必要があります。同時に、新しいローカルデータベースを作成できるように、これらのコマンドを残しておく必要があります。
ステップ1:本番データベースのクリーン
まず、本番データベースのバックアップを作成します。SSMSでデータベースを右クリックし、[タスク]> [データ層アプリケーションのエクスポート...]を選択して、プロンプトに従います。運用データベースを開き、dbo .__ MigrationHistoryテーブルを削除/ドロップします。
ステップ2:ローカル環境のクリーン
マイグレーションフォルダーを開いて削除します。必要に応じて、これをすべてgitから戻すことができると思います。
手順3:初期を再作成
するパッケージマネージャーで、「Enable-Migrations」を実行します(複数のコンテキストがある場合、EFは-ContextTypeNameを使用するように求めます)。「Add-Migration Initial -verbose」を実行します。これにより、現在のコードに基づいてデータベースを最初から作成するための初期スクリプトが作成されます。以前のConfiguration.csでシード操作があった場合は、それをコピーします。
手順4:EFをトリックする
この時点で、Update-Databaseを実行すると、元のエラーが発生します。したがって、EFをだまして、これらのコマンドを実行せずに、EFが最新であると考える必要があります。したがって、作成した初期移行のUpメソッドに移動して、すべてコメントアウトします。
手順5:データベースの更新
Upプロセスで実行するコードがない場合、EFは、このスクリプトが正しく実行されたことを示す正しいエントリを含むdbo .__ MigrationHistoryテーブルを作成します。よろしければ、チェックしてみてください。次に、そのコードのコメントを外して保存します。EFが最新であると判断したことを確認したい場合は、Update-Databaseを再度実行できます。すべてのCreateTableコマンドでUpステップを実行することはありません。すでに実行されていると考えているためです。
ステップ6:EFが実際に最新であることを確認する
まだ移行が適用されていないコードがある場合、これは私がやったことです...
「Add-Migration MissingMigrations」を実行します。これにより、実質的に空のスクリプトが作成されます。コードは既に存在しているため、最初の移行スクリプトでこれらのテーブルを作成するための正しいコマンドが実際にあったため、CreateTableと同等のドロップコマンドをUpメソッドとDownメソッドにカットしました。
次に、Update-Databaseを再度実行し、新しい移行スクリプトが実行されるのを観察して、データベースに適切なテーブルを作成します。
ステップ7:再確認してコミットします。
ビルド、テスト、実行。すべてが実行されていることを確認してから、変更をコミットします。
ステップ8:残りのチームに続行方法を知らせます。
次の人が更新するとき、それまでに実行したスクリプトが存在しない場合、EFは何がヒットしたかを認識しません。しかし、ローカルデータベースを吹き飛ばして再作成できると仮定すると、これで十分です。ローカルデータベースを削除して、EFから再度作成する必要があります。ローカルに変更があり、移行が保留されている場合は、マスターでDBを再度作成し、機能ブランチに切り替えて、移行スクリプトを最初から再作成することをお勧めします。
DROP DATABASE
......