Bagikan melalui


Bekerja dengan DbContext

Untuk menggunakan Kerangka Kerja Entitas untuk mengkueri, menyisipkan, memperbarui, dan menghapus data menggunakan objek .NET, Anda harus terlebih dahulu Membuat Model yang memetakan entitas dan hubungan yang ditentukan dalam model Anda ke tabel dalam database.

Setelah Anda memiliki model, kelas utama yang berinteraksi dengan aplikasi Anda adalah System.Data.Entity.DbContext (sering disebut sebagai kelas konteks). Anda dapat menggunakan DbContext yang terkait dengan model untuk:

  • Menulis dan menjalankan kueri
  • Mewujudkan hasil kueri sebagai objek entitas
  • Lacak perubahan yang dibuat pada objek tersebut
  • Mempertahankan perubahan objek kembali pada database
  • Mengikat objek dalam memori ke kontrol UI

Halaman ini memberikan beberapa panduan tentang cara mengelola kelas konteks.

Menentukan kelas turunan DbContext

Cara yang disarankan untuk bekerja dengan konteks adalah dengan menentukan kelas yang berasal dari DbContext dan mengekspos properti DbSet yang mewakili koleksi entitas yang ditentukan dalam konteks. Jika Anda bekerja dengan Desainer EF, konteks akan dihasilkan untuk Anda. Jika Anda bekerja dengan Code First, Anda biasanya akan menulis konteks sendiri.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

Setelah Anda memiliki konteks, Anda akan meminta, menambahkan (menggunakan Add atau Attach metode ) atau menghapus (menggunakan Remove) entitas dalam konteks melalui properti ini. DbSet Mengakses properti pada objek konteks mewakili kueri awal yang mengembalikan semua entitas dari jenis yang ditentukan. Perhatikan bahwa hanya mengakses properti tidak akan menjalankan kueri. Kueri dijalankan saat:

  • Ini dijumlahkan oleh foreach pernyataan (C#) atau For Each (Visual Basic).
  • Ini dijumlahkan oleh operasi koleksi seperti ToArray, , ToDictionaryatau ToList.
  • Operator LINQ seperti First atau Any ditentukan di bagian terluar kueri.
  • Salah satu metode berikut disebut: Load metode ekstensi, , DbEntityEntry.Reload, Database.ExecuteSqlCommanddan DbSet<T>.Find, jika entitas dengan kunci yang ditentukan tidak ditemukan yang sudah dimuat dalam konteks.

Masa pakai

Masa pakai konteks dimulai ketika instans dibuat dan berakhir ketika instans dibuang atau dikumpulkan sampah. Gunakan menggunakan jika Anda ingin semua sumber daya yang dikontrol konteks dibuang di akhir blok. Saat Anda menggunakan, pengkompilasi secara otomatis membuat blokir coba/akhirnya dan panggilan dibuang di blok terakhir.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

Berikut adalah beberapa panduan umum saat memutuskan masa pakai konteks:

  • Saat bekerja dengan aplikasi Web, gunakan instans konteks per permintaan.
  • Saat bekerja dengan Windows Presentation Foundation (WPF) atau Formulir Windows, gunakan instans konteks per formulir. Ini memungkinkan Anda menggunakan fungsionalitas pelacakan perubahan yang disediakan konteks.
  • Jika instans konteks dibuat oleh kontainer injeksi dependensi, biasanya kontainer bertanggung jawab untuk membuang konteks.
  • Jika konteks dibuat dalam kode aplikasi, ingatlah untuk membuang konteks ketika tidak lagi diperlukan.
  • Saat bekerja dengan konteks jangka panjang, pertimbangkan hal berikut:
    • Saat Anda memuat lebih banyak objek dan referensinya ke dalam memori, konsumsi memori konteks dapat meningkat dengan cepat. Ini dapat menyebabkan masalah performa.
    • Konteksnya tidak aman untuk utas, oleh karena itu tidak boleh dibagikan di beberapa utas yang mengerjakannya secara bersamaan.
    • Jika pengecualian menyebabkan konteks berada dalam status tidak dapat dipulihkan, seluruh aplikasi dapat dihentikan.
    • Kemungkinan mengalami masalah terkait konkurensi meningkat saat kesenjangan antara waktu ketika data dikueri dan diperbarui tumbuh.

Koneksi

Secara default, konteks mengelola koneksi ke database. Konteks membuka dan menutup koneksi sesuai kebutuhan. Misalnya, konteks membuka koneksi untuk menjalankan kueri, lalu menutup koneksi saat semua kumpulan hasil telah diproses.

Ada kasus ketika Anda ingin memiliki lebih banyak kontrol ketika koneksi terbuka dan ditutup. Misalnya, saat bekerja dengan SQL Server Compact, sering disarankan untuk mempertahankan koneksi terbuka terpisah ke database selama masa pakai aplikasi untuk meningkatkan performa. Anda dapat mengelola proses ini secara manual dengan menggunakan Connection properti .