Kerangka Kerja Entitas - Pemuatan Lambat

Lazy loading adalah proses di mana entitas atau kumpulan entitas secara otomatis dimuat dari database saat pertama kali properti yang merujuk ke entitas / entitas tersebut diakses. Pemuatan lambat berarti menunda pemuatan data terkait, hingga Anda secara khusus memintanya.

  • Saat menggunakan jenis entitas POCO, lazy loading dicapai dengan membuat instance dari jenis proxy turunan dan kemudian mengganti properti virtual untuk menambahkan hook pemuatan.

  • Lazy loading adalah defaultnya.

  • Jika Anda meninggalkan konfigurasi default, dan tidak secara eksplisit memberi tahu Entity Framework di kueri Anda bahwa Anda menginginkan sesuatu selain pemuatan lambat, maka pemuatan lambat adalah yang akan Anda dapatkan.

  • Misalnya, saat menggunakan kelas entitas Mahasiswa, Pendaftaran terkait akan dimuat saat pertama kali properti navigasi Pendaftaran diakses.

  • Properti navigasi harus didefinisikan sebagai publik, virtual. Konteks akanNOT melakukan lazy loading jika properti tidak didefinisikan sebagai virtual.

Berikut adalah kelas Mahasiswa yang berisi properti navigasi Pendaftaran.

public partial class Student {

   public Student() {
      this.Enrollments = new HashSet<Enrollment>();
   }
	
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public System.DateTime EnrollmentDate { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

Mari kita lihat contoh sederhana di mana daftar siswa dimuat dari database terlebih dahulu dan kemudian itu akan memuat pendaftaran siswa tertentu kapan pun Anda membutuhkannya.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         //Loading students only
         IList<Student> students = context.Students.ToList<Student>();

         foreach (var student in students) {

            string name = student.FirstMidName + " " + student.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
	
            foreach (var enrollment in student.Enrollments) {
               Console.WriteLine("Enrollment ID: {0}, Course ID: {1}", 
                  enrollment.EnrollmentID, enrollment.CourseID);
            }
         }

         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, Anda akan menerima output berikut.

ID: 1, Name: Ali Alexander
       Enrollment ID: 1, Course ID: 1050
       Enrollment ID: 2, Course ID: 4022
       Enrollment ID: 3, Course ID: 4041
ID: 2, Name: Meredith Alonso
       Enrollment ID: 4, Course ID: 1045
       Enrollment ID: 5, Course ID: 3141
       Enrollment ID: 6, Course ID: 2021
ID: 3, Name: Arturo Anand
       Enrollment ID: 7, Course ID: 1050
ID: 4, Name: Gytis Barzdukas
       Enrollment ID: 8, Course ID: 1050
       Enrollment ID: 9, Course ID: 4022
ID: 5, Name: Yan Li
       Enrollment ID: 10, Course ID: 4041
ID: 6, Name: Peggy Justice
       Enrollment ID: 11, Course ID: 1045
ID: 7, Name: Laura Norman
       Enrollment ID: 12, Course ID: 3141

Matikan Lazy Loading

Pemuatan lambat dan serialisasi tidak cocok, dan jika Anda tidak berhati-hati, Anda dapat membuat kueri untuk seluruh database hanya karena pemuatan lambat diaktifkan. Merupakan praktik yang baik untuk menonaktifkan pemuatan lambat sebelum Anda membuat serial entitas.

Mematikan untuk Properti Navigasi Tertentu

Pemuatan lambat dari koleksi Pendaftaran dapat dimatikan dengan menjadikan properti Pendaftaran non-virtual seperti yang diperlihatkan dalam contoh berikut.

public partial class Student { 

   public Student() { 
      this.Enrollments = new HashSet<Enrollment>(); 
   }
	
   public int ID { get; set; } 
   public string LastName { get; set; } 
   public string FirstMidName { get; set; } 
   public System.DateTime EnrollmentDate { get; set; }
	
   public ICollection<Enrollment> Enrollments { get; set; } 
}

Matikan untuk Semua Entitas

Pemuatan lambat dapat dimatikan untuk semua entitas dalam konteks dengan menyetel bendera pada properti Konfigurasi menjadi salah seperti yang ditunjukkan pada contoh berikut.

public partial class UniContextEntities : DbContext { 

   public UniContextEntities(): base("name = UniContextEntities") {
      this.Configuration.LazyLoadingEnabled = false;
   }
	
   protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
      throw new UnintentionalCodeFirstException(); 
   } 
}

Setelah mematikan pemuatan lambat, sekarang ketika Anda menjalankan contoh di atas lagi Anda akan melihat bahwa Pendaftaran tidak dimuat dan hanya data siswa yang diambil.

ID: 1, Name: Ali Alexander
ID: 2, Name: Meredith Alons
ID: 3, Name: Arturo Anand
ID: 4, Name: Gytis Barzduka
ID: 5, Name: Yan Li
ID: 6, Name: Peggy Justice
ID: 7, Name: Laura Norman
ID: 8, Name: Nino Olivetto

Kami menyarankan Anda untuk menjalankan contoh di atas dengan cara langkah demi langkah untuk pemahaman yang lebih baik.