既存のEFCodeFirstデータベースを最初から削除して再作成する方法


84

VS2012のEF5でEFCode Firstを使用しています。PMupdate-databaseコマンドを使用しており、いくつかのテーブルにサンプルデータを入力するための簡単なシードメソッドがあります。

x.mdbを削除して再作成したいと思います。更新履歴が同期していないようです。コンテキスト内のすべてのDBSetをコメントアウトするupdate-databaseと、エラーなしで実行されますが、DBにいくつかのテーブルが残ります。DBに貴重なデータがないので、すべてをリセットするのが最も簡単なようです。

どうすればこれを達成できますか?

回答:


110

私がそれを正しく理解しているなら...

あなたがしたい場合start clean

1)DBを手動で削除するか(接続がソートされていると仮定します)、空にしsystem __MigrationHistoryますが、テーブルがあるため、DBをまとめて削除する方が簡単/安全です。これも削除する必要があります。

2)すべてを削除しますmigration files-下にMigrationsあり、番号などの名前が付けられています-それらをすべて削除し、

3)移行(およびその他)を含むプロジェクト再構築し、プロジェクトが自動的に構築されるように設定(構成)されていることを確認します(問題が発生する場合がありますが、発生する可能性は低いです)。

4)Add-Migration Initial再実行-その後Update-Database


5
それで、データベース自体を削除するためにef移行を取得するコマンドはありませんか?
cjb110 2014

1
...私が知る限り(最新バージョンは不明)-EF / Migrationsは、Dbがない場合は「作成」し、コードを変更すると「更新」するのが得意です。しかし、あなたはあなたの手の汚れを取得する必要がありますいくつかの管理者のメンテナンスを行う必要があるとき
NSGaga-ほとんどは、非アクティブ

1
また、SQLサーバーオブジェクトエクスプローラーからデータベースを削除する必要がありました。
スティーブン・ジェウリス2017

Update-Databaseを実行する前に、VisualStudioを再起動して機能させる必要がありました。最初の試行では、新しい構造の生成中にエラーが発生しましたが、追加の移行は報告された問題なしで実行されました。
パトリック2017

2
@lpacheco破棄したくないデータを含む本番データベースがある場合は、「既存の...データベースを削除する方法」というタイトルの質問は適切ではなかったことをお勧めします。 。
マークアメリー2017

60

コマンドを使用して移行を作成する正しい方法で作業した場合Add-Migration "Name_Of_Migration"は、次の手順を実行してクリーンスタートを取得できます(もちろん、データの損失を伴うリセット)。

  1. Update-database -TargetMigration:0

    通常、downメソッドが実行されたため、DBは空になりました。

  2. Update-database

    これにより、DBが現在の移行に再作成されます


1
Update-database -TargetMigration:0は、すべてを削除するために-f(force)フラグが必要です。そうしないと、データが失われる可能性があります。コマンドは次のようになります。Update-database-TargetMigration:0 -f
Tascalator 2014

@ Tascalator、-fなしでこれを試したところ、データが失われる可能性についての警告はありませんでした。EF 6.1.2を使用すると、削除されたテーブルにデータがありました。
jk7 2015年

完璧な答え。早くて簡単!thnx
sapatelbaps

EF Core Docsによると、正しいパラメーター名は-Target(EF Core 1.1の場合)または-Migration(EF Core 2.0の場合)
Harvey Darvey

32

パッケージマネージャーコンソールからドロップ、作成、シードする単一ライナー:

update-database -TargetMigration:0 | update-database -force

カブーム。


5
同じステップを2回実行する必要があるのはなぜですか?「update-database
force

ちょっとした通知:「AutomaticMigrationDataLossAllowed = true;」Configration内で必要です。
unicco 2017年

2
EFCoreの同等の構文はUpdate-Database 0。です。とにかく、これは「更新履歴が同期していないように見える」というOPの場合には適していません。このアプローチは、データベースにこれまでに適用されたすべての移行に対して「ダウン」移行を実行することで機能します。したがって、以前に適用された移行を削除した場合、これは失敗します(また、後で移行を変更した場合も同様に失敗する可能性があります)それを適用する)。受け入れ答えは、より堅牢です。そのための-1、および説明のつかない繰り返しupdate-database -force
マークアメリー2017

1
@ SwissCoder-同じ手順を2回行う必要はありません(少なくとも、私は必要ありませんでした)。それはタイプミスだったと思います。
エド・グラハム

1
@SwissCoder正直なところ、私は気づいていない、悪気は意図していない
Vima91

31

EntityFrameworkCoreの場合、次を使用できます。

Update-Database -Migration 0

これにより、データベースからすべての移行が削除されます。次に、以下を使用できます。

Remove-Migration

移行を削除します。最後に、移行を再作成してデータベースに適用できます。

Add-Migration Initialize
Update-Database

EFCorev2.1.0でテスト済み


2
チャームのように機能します!
pavelnieks

4

どうですか..

static void Main(string[] args)
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleContext>());  
    // C
    // o
    // d
    // i
    // n
    // g
}

これは、Programming Entity Framework:Code First、Pg 28 FirstEditionから取得しました。


11
これは良いidaではありません。このコードが本番環境に到達し、クライアントにかなりの頭痛の種をもたらす可能性があります...
Amadeo Gallardo

これは、モデルが変更された場合にのみデータベースを削除します。OPは、モデルが変更されていなくてもデータベースを削除したいと考えています。
クォンティック

1

このチュートリアルに従ってデータベースを作成した場合:https//msdn.microsoft.com/en-au/data/jj193542.aspx

...それならこれはうまくいくかもしれません:

  1. すべて削除.mdfし、.ldfプロジェクトディレクトリ内のファイルを
  2. ビュー/ SQL Serverオブジェクトエクスプローラーに移動し、(localdb)\ v11.0サブノードからデータベースを削除します。https://stackoverflow.com/a/15832184/2279059も参照してください

0

次の手順を実行します。

  1. コンテキストから削除する必要があるオブジェクトを//削除し、Dbset<Item> Items{get;set;} Nugetコンソールでこれらのコマンドを実行します
  2. add-migration [contextName]
  3. update-database -verbose

コンテキストには存在しないが、データベースにすでに作成されているテーブルを削除します



0

新しいユーザーが役立つと思うので、ここで回答を更新するのを手伝いましょう。データベース自体を削除し、EF CodeFirstアプローチを使用してデータベースを再作成することが目的だと思います。1。「。sln」拡張子を使用して、VisualStudioでプロジェクトを開きます。2.サーバーエクスプローラーを選択します(多くの場合、左側にあります)3。SQLServerオブジェクトエクスプローラーを選択します。4.削除するデータベースがlocalDBの下に表示されます。それを右クリックして、削除を選択します。


OPは、明示的に言及しているため、コマンドラインで実行されるコマンドを探していたようですupdate-database。また、シードについて言及しているため、テスト用の自動化されたソリューションを探していたと思います。したがって、UIソリューションはおそらく彼らが探しているものではありません。
valkn0t

-2

この質問はいつか新しいEFCoreユーザーによってクリックされる予定であり、上位の回答はやや不必要に破壊的であることがわかったので、「新たに」開始する方法を紹介します。これにより、すべてのデータが削除されることに注意してください。

  1. MSSQLサーバー上のすべてのテーブルを削除します。__EFMigrationsテーブルも削除します。
  2. タイプ dotnet ef database update
  3. EF Coreは、データベースをゼロから最新の移行まで再作成します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.