エンティティフレームワーク4.3でデータを増分する最良の方法
-
27-10-2019 - |
質問
私は既存のデータベースでエンティティフレームワーク4.3を使用しており、私が対応しようとしているいくつかのシナリオがあります。
まず、データベースを削除する場合は、ゼロから再作成するためにEFを削除したいと思います。これについては、createdAtabaseifnotexistsのデータベースIntialiserを正常に使用しました。
第二に、モデルを更新し、データベースが既に存在する場合、データベースを自動的に更新したいと思います。これにエンティティフレームワーク4.3の移行を正常に使用しました。
これが私の質問です。私のモデルに新しいテーブルを追加すると、いくつかの参照データが必要です。これは、データベースIntialiserが実行されたときと移行が実行されたときにこのデータが作成されることを保証する最良の方法です。私の願いは、DBをゼロから作成したとき、また移行の実行の結果としてデータベースが更新されるときにデータが作成されることです。
いくつかのEF移行の例では、私は人々が移行のUPメソッドでSQL()関数を使用してシードデータを作成するのを見ましたが、可能であれば、コンテキストを使用してシードデータを作成したい(ほとんどのデータベースイニシャルイニシャルの例でわかるように) EFのアイデア全体がそれを抽象化しているときに、純粋なSQLを使用することは私にとって奇妙に思えます。私はUPメソッドでコンテキストを使用しようとしましたが、何らかの理由で、移動に作成されたテーブルが、呼び出しの真下にシードデータを追加してテーブルを作成しようとしたときに存在するとは思いませんでした。
どんな知恵にも大歓迎されました。
解決
エンティティを使用してデータをシードしたい場合は、使用する必要があります Seed
移行構成のメソッド。新鮮なプロジェクトを生成する場合 Enable-Migrations
この構成クラスを取得します:
internal sealed class Configuration : DbMigrationsConfiguration<YourContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(CFMigrationsWithNoMagic.BlogContext context)
{
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
}
}
移行の種シードデータは、非常に基本的な播種に使用されるはずであるため、それほど効率的ではありません。新しいバージョンの更新はすべてセット全体を通過し、既存のデータを更新するか、新しいデータを挿入しようとします。使用しない場合 AddOrUpdate
拡張方法データがまだ存在していない場合にのみ、データがデータベースにシードされることを手動で確認する必要があります。
多くのデータを播種する必要があるため、シードの効率的な方法が必要な場合は、より良い結果が得られます。
public partial class SomeMigration : DbMigration
{
public override void Up()
{
...
Sql("UPDATE ...");
Sql("INSERT ...");
}
public override void Down()
{
...
}
}
他のヒント
使用することはお勧めしません Sql()
あなたの電話 Up()
方法(IMO)これは、シードコードではなく組み込み関数がない実際の移行コードを実際に意図しているためです。
私は種子データを将来変化する可能性のあるものと考えるのが好きです(私のスキーマがそうでない場合でも)。したがって、シード機能のすべての挿入物の周りに「防御的」チェックを書いて、操作が発射されないことを確認するだけです以前。
3つのエントリから始まる「タイプ」テーブルがあるが、後で4番目を追加するシナリオを考えてみましょう。これに対処するために「移行」を必要としないはずです。
使用 Seed()
また、一緒に作業するための完全なコンテキストを提供します。 Sql()
ラディスラフが示した方法。
また、移行コードとシードコードの両方に組み込みのEFメソッドを使用する利点は、データベース操作がプラットフォーム中立のままであることであることに留意してください。これは、スキーマの変更とクエリがOracle、Postgreなどで実行できることを意味します。実際のRAW SQLを書くと、不必要に自分自身をロックする可能性があります。
EFを使用している人の90%がSQL Serverをヒットするだけであるため、これについてあまり心配していないかもしれませんが、ソリューションについて別の視点を与えるためにそこに投げ出します。