5

EF4.3の移行APIを使用してシードデータを実行する方法を知っています。私は一晩中それで遊んでいます。ただし、私の最終的な目標は、ユーザーがソース管理からプロジェクトをプルしてF5キーを押すことができるようになるまでプロジェクトを取得することです。これで、データベース、シードデータ、その他すべてを実行できます。

現在、コードファーストはフレッシュビルドでDBをビルドする優れた仕事をしていますが、パッケージマネージャーコンソールでUpdate-Databaseを実行するまで、シードデータは挿入されません。その時点で、シードメソッドを実行し、シードデータを挿入します。

  1. OnModelCreatingメソッドでそれを実行しても大丈夫ですか?
  2. ここでAddOrUpdate拡張メソッドを引き続き利用できますか?
  3. このシードデータは、F5キーを押すたびに実行されますか?もしそうなら、DBがすでに作成されているかどうかを検出し、最初のデータベース作成時にのみこのシードデータを追加できますか?
4

2 に答える 2

9
  1. No.OnModelCreatingは、モデル定義を作成する必要があるたびに実行されます=アプリケーションを起動し、初めてデータアクセスを使用するたびに実行されます。開発環境では良いかもしれませんが、本番環境では良くありません。さらに、構築中はコンテキストを使用できないため、このメソッドでデータをシードする唯一の方法は、SQLを直接使用することです。
  2. AddOrUpdate 主に移行用です。隠れたコスト(データベースへの反映とクエリ)があるため、慎重に使用してください。
  3. SQLクエリを手動で実行することで検出できますが(コンテキストの構築時にはこのメソッドを使用できないため、Database.Exists内部では使用できません)、これは=>単一責任パターンOnModelCreatingに属さないものです。OnModelCreating

これを行うためのより良い方法があります。

  • MigrateDatabaseToLatestVersionEF 4.3のデータベース初期化子は、データベースが存在しない場合、または既存のデータベースを更新する場合に、移行セットを実行します。
  • アプリケーションのブートストラップでクラスを使用DbMigratorし、データベースを最後のバージョンに移行して、プロセス全体をより高度に制御できます。
  • 可能かどうかは確認していませんが、MSBuildを変更するか、プロジェクトにビルド前のアクションを追加して、Power Shellコマンドを使用するか、DbMigratorクラスを使用してカスタムコンソールアプリケーションを実行できるようにする必要があります。
于 2012-03-02T08:24:57.393 に答える
4

CreateDatabaseIfNotExists クラスから継承するときに、オーバーライドされた Seed() メソッドでデータをシードすると何が問題になりますか?

EF 4.2以下で動作し、EF 4.3+でも動作しているようです

于 2012-03-21T19:08:54.253 に答える