質問: Update-databaseが次のメッセージを返すときに、データを失うことなく、コードと同期してEFを元に戻す方法 > エラーメッセージ:System.Data.SqlClient.SqlException(0x80131904):データベースに「 '」という名前のオブジェクトが既に存在します。 > >
回答: 私は当初、私がいくつかの同僚のようにしばらくの間probleと闘っていたので、これを自己回答の質問として書きましたが、残念ながら私の答えは削除され、回復できません。 古い移行を「クリーンアップ」しようとしているので、何度か起こると思われる状況だから、ステップバイステップの手順でドキュメント化すると思った。 initスクリプトが不完全であった、と移行スクリプトがすでに存在してテーブルを作成するため、本番データベースへの更新を適用することができなかったので、我々は、新しいローカルデータベースを作成することはできませんができませんでした。 **で、我々は自分自身を発見した状況の説明** 。そして、我々は生産データを削除したくなかった。 **症状** : ***Update-Database***が作成スクリプトを実行しようとしており、データベースにすでに同じ名前のテーブルがあるため、 ***Update-Databaseを***実行できません。 > エラーメッセージ:System.Data.SqlClient.SqlException(0x80131904):データベースに「 '」という名前のオブジェクトが既に存在します。 > > **問題の背景** :詳細を理解するには、ここで参照されている両方のビデオを見てみることをおすすめします。https.aspx) : //msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx.aspx) 要約すると、EFは、現在のデータベースの場所と、dbo .__ MigrationHistoryというデータベース内の表に基づいて、コードの場所を比較します。 Migration Scriptsを見ると、スクリプトの最後の場所を再確認しようとします。できない場合は、順番に適用しようとします。つまり、最初の作成スクリプトに戻り、UPコマンドの最初の部分を見ると、エラーが発生していたテーブルのCreeateTableになります。 **解決策** :本番データベースが既に存在するため、これらのCreateTableコマンドを「適用しない」にしている間に、EFをトリックして現在のデータベースが最新であると考えるようにします。プロダクションDBが設定されると、ローカルデータベースも作成する必要があります。 **手順1:プロダクションDBのクリーン**まず、 **プロダクションDB**のバックアップを作成します。 SSMSでは、データベースを右クリックし、[タスク]> [データ層アプリケーションのエクスポート...]を選択し、プロンプトに従います。本番データベースを開き、dbo .__ MigrationHistoryテーブルを削除または削除します。 **手順2:ローカル環境のクリーンアップ**移行フォルダを開き、削除します。私はあなたが必要に応じてgitからすべてを戻すことができると仮定しています。 **ステップ3:初期設定を再作成**するパッケージマネージャで、 "Enable-Migrations"を実行します(複数のコンテキストがある場合は、-ContextTypeNameを使用するようEFが指示します)。 「Add-Migration Initial -verbose」を実行します。これにより、現在のコードに基づいて最初からデータベースを作成するための初期スクリプトが作成されます。以前のConfiguration.csにシード操作があった場合は、それをコピーします。 **ステップ4:トリックEF**この時点で、 ***Update-Database***を実行すると元のエラーが発生します。だから、これらのコマンドを実行しなくても、EFを最新のものだと考えるようにEFを騙す必要があります。それで、作成した初期移行のUpメソッドに入り、すべてコメントアウトします。 **ステップ5:Update-Database** Upプロセスで実行するコードがない場合、EFはdbo .__ MigrationHistoryテーブルを正しいエントリで作成し、このスクリプトを正しく実行したと言います。あなたが好きなら、それをチェックしてください。さて、そのコードのコメントを外して保存してください。 EFが最新のものであると確認したい場合は、 ***Update-Databaseを***再度実行することができます。既に完了していると考えられるため、すべてのCreateTableコマンドでUpステップを実行しません。 **ステップ6:EFが実際に最新であることを確認する**移行がまだ適用されていないコードがある場合は、これが私の行いです... "Add-Migration MissingMigrations"を実行すると、実際に空のスクリプトが作成されます。コードはすでに存在していたため、最初の移行スクリプトでこれらのテーブルを作成する正しいコマンドが実際にあったため、CreateTableと同等のドロップコマンドをUpメソッドとDownメソッドに切りました。 今度は、 ***Update-Databaseを***再度実行し、新しい移行スクリプトを実行して、データベースに適切なテーブルを作成することを確認します。 **ステップ7:再確認とコミット。**ビルド、テスト、実行。すべてが実行されていることを確認し、変更をコミットします。 **ステップ8:他のチームに進める方法を知らせます。**次の人が更新されると、EFは前に実行したスクリプトが存在しないと考えた場合、何がヒットしたのか分かりません。しかし、ローカルデータベースを吹き飛ばして再作成できるとすれば、これはすべて良いことです。ローカルデータベースを削除し、EFから再度作成する必要があります。ローカルの変更や保留中の移行があった場合は、マスターでデータベースを作成し、機能ブランチに切り替えて、移行スクリプトを最初から再作成することをお勧めします。