web-dev-qa-db-ja.com

Entity Frameworkのデータベースを再作成する方法は?

Code-First Entity Frameworkを使用して、ASP.Net MVC 5プロジェクトで悪い状態に陥りました。データを失うことは気にせず、新鮮に始め、データベースを再作成し、Code-First移行の使用を開始できるようにしたいだけです。

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

後で、展開データベース(Azure上のSQL Server)を同期させたいと思います。繰り返しますが、すべてのデータをドロップしても構いません-ただ動作させたいだけです。

クリーンな状態に戻すためのハウツー手順を提供してください。とても有難い。

135
Toby Sharp

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

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

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

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

4)右クリックして[移行]フォルダーを削除し、削除します。

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でデータベースファイルを完全に削除しなかったことが原因である可能性があります。

201
Lin

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

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

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

完了、新しいデータベースをお楽しみください

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

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

    1. Update-Database -TargetMigration:0 -force [これにより、すべてのテーブルとすべてのデータが破壊されます。]
    2. Update-Database -force [必要に応じて強制的に使用]
44
Steve Coleman

これは私のために働いた:

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

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

その場合、データベースに同じ名前のテーブルが既にある場合に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

Solution:必要なことは、これらのCreateTableコマンドを適用せずに、現在のデータベースが最新であるとEFに考えさせることです。同時に、新しいローカルデータベースを作成できるように、これらのコマンドが存在するようにします。

ステップ1:本番データベースのクリーンアップまず、本番データベースのバックアップを作成します。 SSMSで、データベースを右クリックし、[タスク]> [データ層アプリケーションのエクスポート...]を選択して、プロンプトに従います。実稼働データベースを開き、dbo .__ MigrationHistoryテーブルを削除/ドロップします。

ステップ2:ローカル環境clean移行フォルダーを開いて削除します。必要に応じてgitからこれをすべて取得できると仮定しています。

ステップ3:イニシャルの再作成パッケージマネージャーで、「Enable-Migrations」を実行します(複数のコンテキストがある場合、-ContextTypeNameを使用するように求められます)。 「Add-Migration Initial -verbose」を実行します。これにより、現在のコードに基づいて最初からデータベースを作成する初期スクリプトが作成されます。以前のConfiguration.csにシード操作があった場合、それをコピーします。

ステップ4:EFをトリックするこの時点で、Update-Database、元のエラーが表示されます。そのため、これらのコマンドを実行せずに、EFをだまして最新の情報であると考える必要があります。したがって、作成したばかりの初期移行のUpメソッドに進み、すべてコメントアウトします。

ステップ5:Update-DatabaseUpプロセスで実行するコードがない場合、EFはそれを伝えるために正しいエントリを持つdbo .__ MigrationHistoryテーブルを作成しますこのスクリプトを正しく実行しました。必要に応じて行って確認してください。次に、そのコードのコメントを外して保存します。 EFが最新であると考えていることを確認する場合は、Update-Databaseを再度実行できます。すべてのCreateTableコマンドでUpステップを実行することはありません。既に実行済みだと考えているためです。

ステップ6:EFが実際に最新であることを確認するまだ移行が適用されていないコードがある場合、これは私がやったことです。 。

「Add-Migration MissingMigrations」を実行します。これにより、実質的に空のスクリプトが作成されます。コードが既に存在するため、初期移行スクリプトでこれらのテーブルを作成するための正しいコマンドが実際にあったので、CreateTableおよび同等のドロップコマンドをUpおよびDownメソッドにカットしました。

次に、Update-Databaseを再度実行し、新しい移行スクリプトの実行を監視して、適切なテーブルを作成しますデータベース内。

ステップ7:再確認してコミットします。ビルド、テスト、実行。すべてが実行されていることを確認し、変更をコミットします。

ステップ8:チームの他のメンバーに進行方法を知らせます。次の人が更新されると、EFはスクリプトがヒットしたことを知らない存在しない前に実行されていました。ただし、ローカルデータベースを吹き飛ばして再作成できると仮定すると、これで十分です。ローカルデータベースを削除し、EFから再度作成して追加する必要があります。ローカルに変更があり、移行が保留中の場合は、マスターでデータベースを再度作成し、機能ブランチに切り替えて、移行スクリプトを最初から再作成することをお勧めします。

2

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

5)B. SQL Management Studioがない場合は、「SQL Server Object Explorer」に進みます。 localdb「SQL Server Object Explorer」にプロジェクトdbが表示されない場合、「Add SQL server」ボタンをクリックしてリストに手動で追加します。その後、リストからデータベースを削除できます。

1
Dudi

私のソリューションが最適です
-mdfファイルを削除しました
-データベースを再作成します。

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

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

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

ステップ:希望するデータベース名をデータベースファイル名フィールドに追加します(web.configにあるのと同じ名前を推奨しますAttachDbFilename属性)

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

ステップ5:パッケージマネージャーコンソールでコマンドupdate-databaseを実行します

0
Mbuso Mkhize

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

0
edencorbin