web-dev-qa-db-ja.com

Entity Framework Core 3.0にシードする方法は?

ASP.NET CORE 3.0とEF Coreを使用して、データベースにデータをシードしようとしています。

ドキュメントオンラインソース 、または EF Core 2.1の質問 に従って、DbContextを作成しました。この話)。

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Band>().HasData(
            new Band()
            {
                Id = Guid.Parse("e96bf6d6-3c62-41a9-8ecf-1bd23af931c9"),
                Name = "SomeName",
                CreatedOn = new DateTime(1980, 2, 13),
                Description = "SomeDescription"
            });

        base.OnModelCreating(modelBuilder);           
    }

これは、私が期待することを行いません。アプリケーションの起動時にシードはありません(デバッグ中にメソッドがどこから呼び出された場合でも)。

ただし、移行を追加すると、対応する挿入ステートメントが移行に含まれます(これは私が探しているシードの種類ではありません)。

質問:アプリケーションの起動時にデータベースのシードを実行する正しい方法は何ですか?

データベースをシードするということは、アプリケーションが起動するたびに、いくつかのデータがいくつかのテーブルで保証されることを期待するということです。


シードクラスを作成し、カスタムコードでDatabase.Migrateの後に処理する代替手段がありますが、ドキュメントではデータのシードにOnModelCreatingを使用する必要があると指定されているため、これは回避策のようです。


答えを読んでドキュメントをもう一度読んだ後の私の理解では、「シード」が意味するのは「初期化」であり、データモデルのすぐ隣で行うことができます(そのため、モデルの作成とデータシード部分)。

6
Claudiu A

マイグレーションを使用できます。新しいマイグレーションを作成するだけです(モデルクラスを以前に変更せずに)。生成された移行クラスには、空のUp()およびDown()メソッドがあります。そこであなたはあなたの種まきをすることができます。お気に入り:

protected override void Up(MigrationBuilder migrationBuilder)
{
  migrationBuilder.Sql("your sql statement here...");
}

以上です。

1
Yoss