Khung thực thể - Tải chậm
Tải chậm là quá trình theo đó một thực thể hoặc tập hợp các thực thể được tải tự động từ cơ sở dữ liệu lần đầu tiên khi một thuộc tính tham chiếu đến thực thể / các thực thể được truy cập. Tải chậm có nghĩa là trì hoãn việc tải dữ liệu liên quan, cho đến khi bạn yêu cầu cụ thể.
Khi sử dụng các loại thực thể POCO, tải chậm được thực hiện bằng cách tạo các phiên bản của các loại proxy dẫn xuất và sau đó ghi đè các thuộc tính ảo để thêm móc tải.
Tải chậm là mặc định khá nhiều.
Nếu bạn để cấu hình mặc định và không nói rõ ràng với Entity Framework trong truy vấn của mình rằng bạn muốn thứ gì đó khác hơn là tải chậm, thì tải chậm là những gì bạn sẽ nhận được.
Ví dụ: khi sử dụng lớp thực thể Sinh viên, các Đăng ký liên quan sẽ được tải vào lần đầu tiên thuộc tính điều hướng Đăng ký được truy cập.
Thuộc tính điều hướng nên được xác định là công khai, ảo. Ngữ cảnh sẽNOT thực hiện tải chậm nếu thuộc tính không được xác định là ảo.
Sau đây là một lớp Sinh viên chứa thuộc tính điều hướng của Đăng ký.
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; }
}
Hãy xem một ví dụ đơn giản trong đó danh sách sinh viên được tải từ cơ sở dữ liệu trước tiên và sau đó nó sẽ tải đăng ký của một sinh viên cụ thể bất cứ khi nào bạn cần.
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();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
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
Tắt tính năng tải chậm
Tải chậm và tuần tự hóa không kết hợp tốt và nếu bạn không cẩn thận, bạn có thể kết thúc truy vấn cho toàn bộ cơ sở dữ liệu của mình chỉ vì tải chậm được bật. Bạn nên tắt tính năng tải chậm trước khi tuần tự hóa một thực thể.
Tắt các Thuộc tính Điều hướng Cụ thể
Có thể tắt tính năng tải từng phần của bộ sưu tập Đăng ký bằng cách làm cho thuộc tính Đăng ký không ảo như được minh họa trong ví dụ sau.
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; }
}
Tắt cho tất cả các thực thể
Có thể tắt tính năng tải chậm cho tất cả các thực thể trong ngữ cảnh bằng cách đặt cờ trên thuộc tính Cấu hình thành false như được hiển thị trong ví dụ sau.
public partial class UniContextEntities : DbContext {
public UniContextEntities(): base("name = UniContextEntities") {
this.Configuration.LazyLoadingEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
throw new UnintentionalCodeFirstException();
}
}
Sau khi tắt tính năng tải chậm, bây giờ khi bạn chạy lại ví dụ trên, bạn sẽ thấy rằng Danh sách đăng ký không được tải và chỉ có dữ liệu sinh viên được truy xuất.
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
Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.