Bagikan melalui


Data Seeding

Penyemaian data adalah proses mengisi database dengan sekumpulan data awal.

Ada beberapa cara yang dapat dicapai dalam EF Core:

  • Data benih model
  • Kustomisasi migrasi manual
  • Logika inisialisasi kustom

Data benih model

Tidak seperti di EF6, di EF Core, data penyemaian dapat dikaitkan dengan jenis entitas sebagai bagian dari konfigurasi model. Kemudian migrasi EF Core dapat secara otomatis menghitung operasi penyisipan, pembaruan, atau penghapusan apa yang perlu diterapkan saat meningkatkan database ke versi model baru.

Catatan

Migrasi hanya mempertimbangkan perubahan model saat menentukan operasi apa yang harus dilakukan untuk mendapatkan data benih ke dalam status yang diinginkan. Dengan demikian setiap perubahan pada data yang dilakukan di luar migrasi mungkin hilang atau menyebabkan kesalahan.

Sebagai contoh, ini akan mengonfigurasi data benih untuk Blog di OnModelCreating:

modelBuilder.Entity<Blog>().HasData(new Blog { BlogId = 1, Url = "http://sample.com" });

Untuk menambahkan entitas yang memiliki hubungan, nilai kunci asing perlu ditentukan:

modelBuilder.Entity<Post>().HasData(
    new Post { BlogId = 1, PostId = 1, Title = "First post", Content = "Test 1" });

Jika jenis entitas memiliki properti apa pun dalam status bayangan, kelas anonim dapat digunakan untuk memberikan nilai:

modelBuilder.Entity<Post>().HasData(
    new { BlogId = 1, PostId = 2, Title = "Second post", Content = "Test 2" });

Jenis entitas yang dimiliki dapat disemai dengan cara yang sama:

modelBuilder.Entity<Post>().OwnsOne(p => p.AuthorName).HasData(
    new { PostId = 1, First = "Andriy", Last = "Svyryd" },
    new { PostId = 2, First = "Diego", Last = "Vega" });

Lihat proyek sampel lengkap untuk konteks selengkapnya.

Setelah data ditambahkan ke model, migrasi harus digunakan untuk menerapkan perubahan.

Tip

Jika Anda perlu menerapkan migrasi sebagai bagian dari penyebaran otomatis, Anda dapat membuat skrip SQL yang dapat dipratinjau sebelum eksekusi.

Atau, Anda dapat menggunakan context.Database.EnsureCreated() untuk membuat database baru yang berisi data benih, misalnya untuk database pengujian atau saat menggunakan penyedia dalam memori atau database non-relasional apa pun. Perhatikan bahwa jika database sudah ada, EnsureCreated() tidak akan memperbarui skema atau data benih dalam database. Untuk database relasional, Anda tidak boleh memanggil EnsureCreated() jika Anda berencana menggunakan Migrasi.

Batasan data benih model

Jenis data benih ini dikelola oleh migrasi dan skrip untuk memperbarui data yang sudah ada dalam database perlu dibuat tanpa menyambungkan ke database. Ini memberlakukan beberapa batasan:

  • Nilai kunci utama perlu ditentukan meskipun biasanya dihasilkan oleh database. Ini akan digunakan untuk mendeteksi perubahan data antara migrasi.
  • Data seeded sebelumnya akan dihapus jika kunci utama diubah dengan cara apa pun.

Oleh karena itu fitur ini paling berguna untuk data statis yang tidak diharapkan berubah di luar migrasi dan tidak bergantung pada hal lain dalam database, misalnya kode pos.

Jika skenario Anda menyertakan salah satu hal berikut, disarankan untuk menggunakan logika inisialisasi kustom yang dijelaskan di bagian terakhir:

  • Data sementara untuk pengujian
  • Data yang bergantung pada status database
  • Data yang besar (data penyemaian diambil dalam rekam jepret migrasi, dan data besar dapat dengan cepat menyebabkan file besar dan performa yang terdegradasi).
  • Data yang membutuhkan nilai kunci yang akan dihasilkan oleh database, termasuk entitas yang menggunakan kunci alternatif sebagai identitas
  • Data yang memerlukan transformasi kustom (yang tidak ditangani oleh konversi nilai), seperti beberapa hash kata sandi
  • Data yang memerlukan panggilan ke API eksternal, seperti peran identitas inti ASP.NET dan pembuatan pengguna

Kustomisasi migrasi manual

Saat migrasi ditambahkan, perubahan pada data yang ditentukan dengan HasData diubah menjadi panggilan ke InsertData(), UpdateData(), dan DeleteData(). Salah satu cara mengatasi beberapa batasan HasData adalah dengan menambahkan panggilan atau operasi kustom ini secara manual ke migrasi sebagai gantinya.

migrationBuilder.InsertData(
    table: "Blogs",
    columns: new[] { "Url" },
    values: new object[] { "http://generated.com" });

Logika inisialisasi kustom

Cara mudah dan kuat untuk melakukan penyemaian data adalah dengan menggunakan DbContext.SaveChanges() sebelum logika aplikasi utama memulai eksekusi.

using (var context = new DataSeedingContext())
{
    context.Database.EnsureCreated();

    var testBlog = context.Blogs.FirstOrDefault(b => b.Url == "http://test.com");
    if (testBlog == null)
    {
        context.Blogs.Add(new Blog { Url = "http://test.com" });
    }

    context.SaveChanges();
}

Peringatan

Kode penyemaian tidak boleh menjadi bagian dari eksekusi aplikasi normal karena ini dapat menyebabkan masalah konkurensi saat beberapa instans berjalan dan juga akan mengharuskan aplikasi memiliki izin untuk mengubah skema database.

Bergantung pada batasan penyebaran Anda, kode inisialisasi dapat dijalankan dengan cara yang berbeda:

  • Menjalankan aplikasi inisialisasi secara lokal
  • Menyebarkan aplikasi inisialisasi dengan aplikasi utama, memanggil rutinitas inisialisasi dan menonaktifkan atau menghapus aplikasi inisialisasi.

Ini biasanya dapat diotomatisasi dengan menggunakan profil publikasi.