Entity Frameworkのデータベースを再作成するにはどうすればよいですか?


143

コードファーストエンティティフレームワークを使用して、ASP.Net MVC 5プロジェクトで悪い状態に陥っています。データが失われることは気にせず、新しく開始してデータベースを再作成し、Code-First移行の使用を開始できるようにしたいだけです。

現在、Update-Databaseを実行しようとすると例外がスローされるか、エラーメッセージが表示される状態になっています。また、ウェブサイトはデータベースに正しくアクセスできません。新しいプロジェクトを作成せずに、すべての移行をワイプしてデータベースを再作成し、ゼロから開始するにはどうすればよいですか?つまり、コードは残したいがデータベースは削除したいのです。

後で、デプロイメントデータベース(Azure上のSQL Server)も同期させたいと思います。繰り返しになりますが、すべてのデータを削除してもかまいません-機能させたいだけです。

クリーンな状態に戻すための手順を教えてください。とても有難い。


TBHあなたが単純にしたいならDROP DATABASE......
Worthy7

回答:


209

以下の手順に従ってください:

1)まずVisual Studioのサーバーエクスプローラーに移動し、このプロジェクトの「.mdf」データ接続が接続されているかどうかを確認します。接続されている場合は、右クリックして削除します。

2)ソリューションエクスプローラーに移動し、[すべてのファイルを表示]アイコンをクリックします。

3)App_Dataに移動し、右クリックして、このプロジェクトのすべての「.mdf」ファイルを削除します。

4)右クリックしてMigrationsフォルダーを削除します。

5)SQL Server Management Studioに移動し、このプロジェクトのDBが存在しないことを確認します。それ以外の場合は削除します。

6)Visual Studioのパッケージマネージャーコンソールに移動し、次のように入力します。

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7)アプリケーションを実行する

注:手順6のパート3で「ファイルを添付できません...」というエラーが表示された場合は、SQL Serverでデータベースファイルを完全に削除しなかったことが原因である可能性があります。


優れた!これでうまくいきました、ありがとう!確かに非常に役立ちます。展開データベース(Azure SQL)を再作成する手順は似ていますか?
Toby Sharp

こんにちは@TobySharp、問題ありません。データベースにデータがない場合は、次の手順を実行できますが、データがある場合、手順はまったく同じではありません。
Lin

保持する必要のあるデータがありません。
Toby Sharp

3
更新。Windowsエクスプローラーではなく、VSから(説明に従って)削除した場合、機能します。また、SQL Management Studioがない場合は、VSのSQLオブジェクトエクスプローラーを使用してlocaldbから削除できます。
マイクワード

3
「ファイルを添付できません...」というエラーが表示される場合は、すべて削除したと思われる場合でも、次のスレッドから回答を試してください。stackoverflow.com
Andy

44

リンの答えが正しいことを付け加えたいと思います。

MDFを不適切に削除した場合は、修正する必要があります。プロジェクトのねじ込まれた接続をMDFに固定します。短い答え; 正しく再作成して削除してください。

  1. 新しいMDFを作成し、古いMDFと同じ名前を付けて、同じフォルダーの場所に置きます。新しいプロジェクトを作成し、新しいmdfを作成できます。mdfは削除するため、古いテーブルと一致する必要はありません。古いフォルダを作成するか、正しいフォルダにコピーしてください。
  2. サーバーエクスプローラーで開きます[ソリューションエクスプローラーのmdfをダブルクリックします]
  3. サーバーエクスプローラーで削除する
  4. ソリューションエクスプローラーから削除する
  5. 実行update-database -force [必要に応じて力を使用]

完了しました。新しいdbをお楽しみください

UPDATE 11/12/14-互換性のないdbの変更を行うときはいつもこれを使用します。これは、移行を元のデータベースにロールバックするのに最適な方法であることがわかりました。

  • データベースを元に戻します
  • 通常の移行を実行して現在の状態に戻します

    1. Update-Database -TargetMigration:0 -force [これにより、すべてのテーブルとすべてのデータが破壊されます。]
    2. Update-Database -force [必要に応じて力をかける]

1
お役に立てて嬉しいです...回答を更新します。私は最近、すべての変更をロールバックするより良い方法を見つけました。
スティーブコールマン

8

これは私のために働きました:

  1. Visual StudioのSQL Serverオブジェクトエクスプローラーからデータベースを削除します。右クリックして「削除」を選択します。
  2. ファイルシステムからmdfおよびldfファイルを削除します-それらがまだ存在する場合。
  3. ソリューションを再構築します。
  4. アプリケーションを開始-データベースが再作成されます。

1
ええ、私がしなければならなかったのは、MDFを削除し、web.configの接続文字列を更新してから、アプリケーションを実行して新しいアカウントを登録することだけでした。新しいデータベースに自動的にすべてのテーブルを再度作成しました。
Dan Bechard、2016

3

この質問はデータを気にしないことを前提としていますが、データのメンテナンスが不可欠な場合もあります。

もしそうなら、データベースに同じ名前のテーブルが既にある場合に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を再度作成し、機能ブランチに切り替えて、移行スクリプトを最初から再作成することをお勧めします。


1

@Linの優れた答えに追加したいだけです。

5)B. SQL Management Studioがない場合は、「SQL Serverオブジェクトエクスプローラー」に移動します。localdb "SQL Server Object Explorer"にプロジェクトデータベースが表示されない場合は、[SQLサーバーの追加]ボタンをクリックして、手動でリストに追加します。次に、リストからデータベースを削除できます。


回答に何かを追加したい場合は、新しい回答を投稿するのではなく、その回答にコメントを追加してください。
オリバー

1
私はそれを知らなかった。したがって、技術的には質問に対する(完全な)回答ではないため、回答をコメントに移動してこの回答を削除できます:-)
Oliver

0

私のために働いた可能な非常に単純な修正。server / serverobject explorerで見つけたデータベース参照と接続を削除した後、App_Dataフォルダーを右クリックし(アプリケーション内のオブジェクトは表示されませんでした)、[開く]を選択します。開いたら、すべてのデータベースなどを配置します。バックアップフォルダ内のファイル、または根性がある場合は削除してください。アプリケーションを実行すると、すべてが最初から再作成されます。


0

私のソリューションは次の場合に最適です
-mdfファイルを削除した-db
を再作成したい。

データベース再作成するには、 Visual Studioを使用して接続を追加する必要があります

手順1:サーバーエクスプローラーに移動して、新しい接続を追加します(または、データベースの追加アイコンを探します)。

ステップ2データソースMicrosoft SQL Serverデータベースファイルに変更します

手順3:必要なデータベース名を(データベースファイル名)フィールドに追加します(できれば、web.configのAttachDbFilename属性と同じ名前にしてください)

ステップ4:[参照]をクリックして、配置する場所に移動します。

手順5:パッケージマネージャーコンソールでコマンドを実行するupdate-database

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