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を使用する必要があると指定されているため、これは回避策のようです。
答えを読んでドキュメントをもう一度読んだ後の私の理解では、「シード」が意味するのは「初期化」であり、データモデルのすぐ隣で行うことができます(そのため、モデルの作成とデータシード部分)。
マイグレーションを使用できます。新しいマイグレーションを作成するだけです(モデルクラスを以前に変更せずに)。生成された移行クラスには、空のUp()およびDown()メソッドがあります。そこであなたはあなたの種まきをすることができます。お気に入り:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("your sql statement here...");
}
以上です。