質問

私は既存のデータベースでエンティティフレームワーク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をヒットするだけであるため、これについてあまり心配していないかもしれませんが、ソリューションについて別の視点を与えるためにそこに投げ出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top