8

まずでEF5の移行を実行することができません、私が読んだこれらの質問/答えは:既存のデータベース

これらのすべては、EFのためにあるように見えますEF5以前のバージョンでは、私の状況はこれらの答えに合っていないようです。だから私の状況を説明しましょう。

  1. 私のアプリケーションは、もともとEF4モデルを使用して作成されました。私はGUIデザイナーでデータベースを設計し、それを使ってデータベースを生成しました。
  2. 私は数ヶ月間、データベースにデータを収集し、収集しています。私は本当にこのデータを失うことはできません。
  3. 私は自分のコードを分岐し、NuGetでEF5をインストールし、新しいクラスライブラリプロジェクトを右クリックしてEntity Framework | Reverse engineer code firstを選択して、EF Power Toolsを使用してデータベースからモデルを生成しました。
  4. 私は新しいプロジェクトにスムーズに再参照し、ObjectContextではなく新しいDbContextを使用するようにプロジェクトを変換し、古いモデルを保持していたEF4クラスライブラリを削除できました。プログラムはすごくうまくいきます!

ここで、私はRuby on Railsで少し経験があった自動移行を試してみたいと思います。ここに私がしたことがあります:

  1. Ran Enable-Migrations接続文字列とapp.configが使用されていたために少し問題がありましたが、結局それを手に入れました。しかし、this MSDN pageは、これが私がすでにいるところまで私を連れて来るための最初の移行を自動的に生成したはずだと言います。それはしませんでした。
  2. Ran Add-Migration InitialSchema手順1で自動的に行われなかったことを達成する。これはうまくいった。
  3. Add-Migration AddSerialToLogEntriesを実行しようとし、その後、私のモデルオブジェクトのいずれかにプロパティを追加しました、として発表された次の 明示的なマイグレーションが保留されているので、

明示的な移行を生成することができません:[201307190100268_InitialSchema] 。 新しい明示的な移行を生成する前に、保留中の明示的な移行を適用してください。

既存のデータベースでの移行を試行すると失敗しました。これは驚くべきことではありません。

上記の他の回答は基本的には私が運がないと言っていましたが、私はEntity Frameworkの古いバージョンのものだと言いました。私はここにオプションがありますか?

SQL Server Management Studioを使用してSQLスクリプトにデータをエクスポートしたり、データベース全体を削除したり、EFで作成したり、スクリプトを実行してデータを元に戻したりすることができます...私は時間があるとき明日それを試してみますが、私は100%が動作し、プロセスに挿入されたデータにエラーが発生したくないと思うので、他のオプションがあるかどうか聞いてみたいと思います。

答えて

12

は、マイグレーションを有効に蘭。接続文字列 と、どのapp.configが使用されていたのかで少し問題がありましたが、結局それを得ました。しかし、 このMSDNページには、これが既に の最初の移行を自動的に生成して、私がすでに行っているところまで来るはずだと言われています。それはしませんでした。

は自動的にこれが働いて、ステップ1で行われていない たものを達成するために追加-移行InitialSchemaを実行しました。実際に

enable-migrationsコマンドが、その場合には、データベースが__MigrationHistoryテーブルが含まれている前に、データベースがすでにコード・ファーストで作成された場合にのみ、最初の移行を作成します。このテーブルが存在しない場合(既存のデータベースがCode-Firstで以前に作成されたことがない場合)、enable-migrationsConfigurationクラスのみを作成します。 add-migrationを手動で呼び出してから、最初のマイグレーションクラスを作成する必要があります。だから、あなたが見た行動が期待されます。パッケージマネージャコンソールで

  • コールenable-migrations:あなたはEF 5を使用している場合

    は、一般的手順は、移行のための既存のデータベースがある次を作製しました。プロジェクトのMigrationsフォルダとConfigurationクラスが作成されます。

  • Configurationクラスを開き、AutomaticMigrationsEnabled = falseをコンストラクタに設定します(既定ではまだ設定されていない場合)。パッケージマネージャコンソールコール

    add-migration -IgnoreChanges InitialSchema 
    

    "InitialSchema" で

  • は一例名です。あなたは好きなように名前を付けることができます。 DbMigrationに由来する<Timestamp>_InitialSchemaクラスが作成されます。このクラスのUpおよびDownメソッドは、-IgnoreChangesフラグのために空です。このフラグがなければ、既存のデータベースにすでにデータベーススキーマが含まれているため、クラスにはモデル全体をデータベースに追加するための移行が含まれます。パッケージマネージャコンソールで

  • 実行update-databaseUp方法が空であるため、この更新プログラムは、それが(データベース内のシステムテーブルなど)__MigrationHistoryテーブルを作成し、現在のEFモデルのモデルハッシュが含まれているこのテーブルに最初のレコードを追加除いて、既存のスキーマと何もしません。

  • オプションの最後のステップ:自動移行を使用する場合は、Configurationクラスを開き、コンストラクタにAutomaticMigrationsEnabled = trueを設定します。コードベースの移行を続行する場合は、フラグfalseを残します。

この時点でモデルに変更を加えることができます。 add-migrationで新しい移行を作成するたびに、変更前のモデルに基づいており、移行クラスには必要なスキーマ変更のみが含まれます。

+0

偉大な、詳細な答え。できるだけ早くあなたの歩みを試してみます。 Migrationsフォルダを単に削除するだけで、有効化移行を "元に戻す"ことができますが、最初の移行のUpとDownメソッドを削除してからやり直すこともできますか? – Steve

+0

@スティーブ:はい、それはうまくいくはずです。 – Slauma

+0

偉大な働きました、ありがとう! – Steve

3

私はあなたの開発環境で一からデータベースを作成するためにマイグレーションを使用することができます状態であなたを残して、わずかに異なるアプローチを示唆している:

  1. よりもむしろadd-migration -IgnoreChanges InitialSchemaを呼び出すと、 が取得しよう作業の初期スキーマ移行の生成 これは、最初に Enable-Migrationsを呼び出したときに発生します。データベース接続が存在しないデータベースに を指すようにすると、これを機能させることができます。

  2. その結果、あなたのInitialSchema移行では、リバースエンジニアリング ときにそれをそれがポイントであったようにデータベースを作成する ロジックが含まれています。 Up()Down()の内容は、すでに既存のデータベースがあるすべての環境 にデプロイするまでコメント化する必要があります。

  3. その後、あなたの開発環境で使用すると、データベースを削除し、

    var migrator = new DbMigrator(new Configuration()); 
    migrator.Update(); 
    

    を使用してそれらを再作成し、あなたがのフルセットを持っているだろうことができ、これらのメソッドの内容のコメントを解除してから 上からすることができます__MigrationHistory テーブルの移行これが重要な理由は、それがなければ、将来新しい の移行を追加することができなくなるからです。

関連する問題