2

私はエンティティフレームワークのコードを最初に使用しているプロジェクトで作業しています。 私のweb.configがローカルで実行されているときに、CreateDatabaseIfNotExists<DataContext>を実装しているデータベース初期化ツールを対象にしています。テストデータで開発データベースをシーズニングしますが、初めて実行時にさまざまな '静的'ルックアップ可能データを入力します。エンティティフレームワークの移行を使用するプロジェクトのシードとブランチ

開発データベースが作成されると、それ以降のデータベースへの変更はプロジェクトへの移行を追加し、 'updata-database' PSコマンドを使用してデータベースを更新します。

私はプロジェクトに満足していますが、webdeployでコードを配備しますが、webdeployには移行テーブルが含まれていないため、データベースを手動でコピーします。デプロイするときには、web.configトランスフォームを使用して、MigrateDatabaseToLatestVersion<DataContext>を実装する新しいデータベースイニシャライザを設定します。これにより、その後に展開される新しいコードベースの移行が適用されます。 これはすべて正常に動作しますが、これはテストデータだけでなくアプリケーションを実行するために必要なデータも含めてデータベースを初期化する最良の方法であるかどうかという懸念があります。 私が探しているのは、最初のシードデータをCreateDatabaseIfNotExists<DataContext>にフックせずに、Migrateにフックするだけの良い方法です。 設定クラスにシードメソッドがありますが、すべての移行でデータベースを更新しているので、これは望ましい解決策ではありません。

プロジェクトはTFSにあり、時々私はエッセンスであるこのプロジェクトの新しいブランチを作成する必要があります最初のクローンです。これを初めてローカルに実行すると、データベースはまだ存在しませんが、前述のように作成され、シードされます。今最も大きな問題は、データベースが初めて作成されたときに、以前に移行によって処理されたスキーマの変更が適用されることです。新しい移行ファイルを追加して 'update-database'を実行しようとすると、データベースが作成されたときにこれらの変更が既に適用されていたため、以前の移行を実行できなくなりました。私はここで何か間違っているとか、単にトリックを逃したと想像することしかできません。

結論として、私は、最初のテストデータをシードする&必要なアプリケーションデータを移行を使用して最初にデータベースを作成するときに

  1. 最良の方法に関する情報を探しています。
  2. コード移行を含むプロジェクトを分岐してデータベースを初めて作成するときの問題を克服する最善の方法。

お読みいただきありがとうございます。 の移行を使用して最初にデータベースを作成する際に最初の試験データを&必要なアプリケーションデータをシードする

答えて

1

最善の方法。

移行構成には、この問題を解決するために正確に存在するSeedメソッドがあります。この方法では、AddOrUpdate拡張メソッドを使用してコアデータを初期化できます。拡張メソッドは、レコードがすでにデータベースに存在するかどうかを確認し、レコードを更新するか、新しいレコードを挿入します。

+0

私は上記のシードメソッドを知っています。それを使用することで私の懸念は、移行が実行されるたびに実行されることです。 私の最初のコアデータの一部は、アプリケーションの実行中に変更される可能性があります。新しいマイグレーションが追加された場合にリセットしたくありません。 Seedメソッドを構成クラスにラップして 'InitialCreate'マイグレーションでのみ実行できるようにする方法があれば、これはうまくいくと思いますが、これを行うには良い方法が見つかりませんでした。 – Drauka

+0

'Seed'メソッドの呼び出しが再現可能であることを確認するのはあなたの責任です - ' AddOrUpdate'がそれを助けることができます。マイグレーション時にカスタムシーディングSQL文を直接 'Up'メソッドに追加することができない場合は、 –

+1

私はあなたが言っていることを理解していますが、エンティティフレームワークを使用する多くの理由の1つは、比較的複雑なSQL挿入ステートメントを書く必要を避けることでした。文脈を通じて播種するのではなく、私は別の解決策に取り組んでいます。 – Drauka

1

Seedメソッドを使用してデータベースを初期化することは、非常に小さく単純なデータセット以外は間違いです。理由はあなたが言うように、それは単にあまりにも頻繁に実行されます。データの初期化をアプリケーションから移動し、代わりにインストールプロセスに移しました。私たちは、通常のエンティティフレームワークコードを使用して必要なデータを作成する一連のメソッドを作成しました。このようにして、パフォーマンスを心配する必要はなく、データ作成コードを検証するテストをより簡単に作成できます。

開発中にデータベースを初期化するために、インストーラと同じコードを実行する単体テストがあります。開発者は単体テストを実行するだけで、データベースは適切に初期化されます。

関連する問題