41

私は既存のデータベースで Entity Framework 4.3 を使用しており、対応しようとしているシナリオがいくつかあります。

まず、データベースを削除した場合、EF で最初から再作成したいと思います。これには、CreateDatabaseIfNotExists データベース初期化子を正常に使用しました。

次に、モデルを更新し、データベースが既に存在する場合、データベースを自動的に更新したいと考えています。これには Entity Framework 4.3 Migrations を使用しました。

だからここに私の質問があります。いくつかの参照データを必要とする新しいテーブルをモデルに追加するとします。データベース初期化子の実行時と移行の実行時の両方でこのデータが確実に作成されるようにする最善の方法です。私の望みは、データベースを最初から作成しているときにデータが作成され、移行の実行の結果としてデータベースが更新されたときにも作成されることです。

いくつかの EF 移行の例では、人々が移行の UP メソッドで SQL() 関数を使用してシード データを作成するのを見てきましたが、可能であれば、コンテキストを使用してシード データを作成したいと思います (ほとんどのデータベース初期化子の例で見られるように)。 EFの全体的なアイデアがそれを抽象化しているときに、純粋なSQLを使用するのは奇妙に思えます。UP メソッドでコンテキストを使用しようとしましたが、何らかの理由で、テーブルを作成する呼び出しのすぐ下にシード データを追加しようとすると、移行で作成されたテーブルが存在するとは見なされませんでした。

どんな知恵も大歓迎です。

4

2 に答える 2

55

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()
    {
        ...
    }
}
于 2012-02-18T19:08:46.883 に答える