Sejak kemarin saya mengalami masalah aneh dengan metode penyemaian DB saya dan sepertinya saya tidak bisa mengetahuinya.

Saya membuat kelas untuk menyemai DB saya, mendaftarkannya untuk DI dan memanggil metode penyemaiannya dari Startup.Configure. Di dalam saya memastikan DB dibuat, lalu saya menghasilkan data untuk mengisinya. Menambahkan beberapa set data pertama berfungsi dengan baik. Namun pada titik tertentu saya perlu menambahkan jumlah data yang sedikit lebih besar ke tabel (200 baris).

Saya membuat Daftar untuk menyimpan entri dan melanjutkan untuk menambahkannya dengan memanggil await _context.AddRange(List) diikuti oleh await _context.SaveChangesAsync(). Eksekusi membeku saat menyimpan. Tugas Lainnya, seperti tugas latar belakang yang saya daftarkan masih berjalan. Juga tidak ada Pengecualian yang dilemparkan. Jika saya mengubah kedua eksekusi ke rekan sinkronnya, itu akan berhasil. Ini membuat saya berpikir bahwa saya menemui jalan buntu. Tetapi karena layanan latar belakang masih berjalan dan saya tidak dapat men-debug apa yang terjadi dalam metode penyemaian saya, saya tidak tahu apakah ini bahkan bisa menjadi jalan buntu atau tidak.

Saya bisa saja melanjutkan dan menggunakan panggilan sinkron tetapi saya merasa seperti kehilangan sesuatu di sini dan kemungkinan akan mengalami masalah lagi. Bagian yang paling aneh adalah bahwa data yang saya coba tambahkan ke tabel hanya mulai membekukan eksekusi setelah saya menambahkan lebih banyak kolom. Sebelumnya saya memanggil await _context.Add(data) di semua baris dan hanya memanggil await _context.SaveChangesAsync() di akhir. Pada saat itu tabel memiliki sekitar 15 kolom. Ketika saya memperluas tabel menjadi 30 kolom, panggilan ini dan panggilan yang disebutkan di atas tidak berfungsi lagi. Satu-satunya petunjuk bagi saya adalah peningkatan jumlah data yang harus ditambahkan yang membuat kebuntuan lebih mungkin terjadi tetapi sebaliknya saya kehabisan ide.

0
Alpha 9 April 2020, 13:01

1 menjawab

Jawaban Terbaik

Saya membuat kelas untuk menyemai DB saya, mendaftarkannya untuk DI dan memanggil metode penyemaiannya dari Startup.Configure.

Anda seharusnya tidak menjalankan apa pun di Startup.Configure, apalagi sesuatu yang tidak sinkron. Jika Anda perlu menjalankan sesuatu saat memulai aplikasi, lakukan di Program.Main Anda, dan karena ini asinkron, Anda harus beralih menggunakan Main async:

public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    var seed = host.Services.GetRequiredService<SeedClass>();
    await seed.SeedAsync();

    await host.RunAsync();
}

Yang mengatakan, ini bukan cara Anda seharusnya menyemai dengan EF, terlepas dari itu. Sejak EF 2.1, Anda melakukan seed melalui HasData di OnModelCreating:

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

Lihat dokumen untuk detail selengkapnya.

0
Chris Pratt 9 April 2020, 14:19