Tìm hiểu về Lazyloading và Earger Loading trong Entity Framework
Bài viết này chúng ta sẽ tìm hiểu về Lazyloading, Earger Loading và Explicit Loading trong Entity Framework mà chúng ta thường xuyên gặp trong thực tế. Ở 3 khái niệm này, chúng ta đều tham chiếu đến việc load các entity liên quan.
Eager Loading
Eager loading giúp bạn load tất cả các entity trong 1 câu lệnh, tất cả các entity con sẽ được load ra trong 1 lần gọi duy nhất. Điều này có thể được thực hiện thông qua phương thức Include, sẽ trả về các entity liên quan như một phần của câu query và một lượng lớn dữ liệu sẽ được load ra 1 lần.
Ví dụ, bạn có một bản User và một bảng UserDetails (bảng này liên kết đến bảng User), sau đó bạn sẽ viết code như dưới đây. Chúng ta sẽ load ra user với Id của nó bằng UserId ở bảng UserDetails.
User usr = dbContext.Users.Include(a => a.UserDetails).FirstOrDefault(a => a.UserId == userId);
Nếu có nhiều cấp độ hơn chúng ta có thể sử dụng câu lệnh sau:
User usr = dbContext.Users.Include(a => a.UserDetails.Select(ud => ud.Address)).FirstOrDefault(a => a.UserId == userId);
Lazy Loading
Đây là một hành vi mặc định của Entity Framework, khi mà các entity con được load ra chỉ khi chúng được truy cập lần đầu tiên. Đơn giản là hoãn lại việc load các dữ liệu ở các enttiy liên quan cho đến khi bạn yêu cầu nó.
Ví dụ, khi chúng ta chạy câu lện bên dưới, bảng UserDetails sẽ không được tải ra theo bảng User:
User usr = dbContext.Users.FirstOrDefault(a => a.UserId == userId);
Nó sẽ chỉ được load ra khi bạn công khai gọi nó:
UserDeatils ud = usr.UserDetails; // UserDetails are loaded here
Xét thêm 1 ví dụ nữa:
public class Person{
public String Name{get; set;}
public String Email {get; set;}
public virtual Employer employer {get; set;}
}
public List<EF.Person> GetPerson(){
using(EF.DbEntities db = new EF.DbEntities()){
return db.Person.ToList();
}
}
Sau khi phương thức GetPerson() được gọi, bạn không thể dùng lazyloading để truy cập vào thuộc tính employer để lấy ra đối tượng Employer khi ra ngoài phương thức nữa. Vì sao? Vì đối tượng db đã bị hủy sau khi ra ngoài khỏi khối using. Vây bạn phải dùng Person.Include(x=>x.employer) để load sẵn dữ liệu của Employer vào thuộc tính của person trước khi đối tượng db bị hủy.
Explicit Loading
Có nhiều tùy chọn để disable tính năng Lazyloading trong Entity Framework. Sau khi tắt Lazy Loading, bạn có thể vẫn load các enttiy liên quan bằng cách gọi tường minh phương thức Load() để tải các entity liên quan. Có 2 cách sử dụng phương thức Load, Reference và Collection (để load collections):
User usr = dbContext.Users.FirstOrDefault(a => a.UserId == userId);
dbContext.Entry(usr).Reference(usr => usr.UserDetails).Load();
Khi nào sử dụng cái gì:
- Sử dụng Eager loading khi các mối quan hệ không quá nhiều. Vì thế Eager loading là cách tối để giảm lượng query đến server vì chỉ có 1 query duy nhất.
- Sử dụng Eager loading khi bạn chắc chắn bạn sẽ sử dụng các entity liên quan với entity chính ở nhiều nơi và nhiều lần.
- Sử dụng Lazyloading khi bạn sử dụng qua nhệ 1-N
- Sử dụng Lazyloading khi bạn chắc chắn bạn không sử dụng các entity liên quan ngay lập tức.
- Khi bạn tắt tính năng Lazyloading, sử dụng Explicit loading khi bạn không chắc rằng bạn sẽ có sử dụng entity trước đó hay không.
Tác giả: Bạch Ngọc Toàn
Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.
Bài viết liên quan
Nâng cấp RAG thành Agentic RAG với Dynamic Toolcall | Xây dựng RAG AI
Vậy làm thế nào để nâng cấp RAG thành một hệ thống Agentic RAG thông minh hơn, có khả năng tự động quyết định khi nào và nên gọi tool nào? Câu trả lời chính là Dynamic Toolcall.
Đọc thêm
Tối ưu kết quả trả về từ VectorDB với Scoring và Fingerprint | Xây dựng RAG AI
Đến Phần 3 này, chúng ta sẽ cùng nâng cấp khả năng tìm kiếm và truy vấn dữ liệu từ VectorDB.
Đọc thêmTrang bị Memory cho RAG bằng Vector Database với Qdrant
Ở phần tiếp theo này, chúng ta sẽ tiến thêm một bước quan trọng: trang bị bộ nhớ (Memory) cho RAG bằng cách sử dụng Vector Database Qdrant.
Đọc thêm
Hướng dẫn tạo ứng dụng ASP.NET Core (.NET 8) và chuẩn bị kết nối OpenAI Chat Model để xây dựng RAG AI
Trong bài viết này, chúng ta sẽ bắt đầu một hành trình nhỏ: xây dựng một ứng dụng RAG AI (Retrieval-Augmented Generation).
Đọc thêm
Ra mắt khóa học: TEDU-53: Xây dựng ứng dụng CMS với ASP.NET Core 8.0 + Angular.
Ngay bây giờ các bạn có thể đăng ký thông qua mã giảm giá tại trang chi tiết khóa học. Mã giảm giá sẽ được vô hiệu hóa khi đủ số lượng người theo thang bậc.
Đọc thêm
10 thủ thuật để tăng tốc độ ứng dụng .NET Core 3.x
Trong bài viết này mình sẽ đưa ra 10 mẹo để giúp bạn tăng tốc ứng dụng ASP.NET Core 3.
Đọc thêm
Migrate hệ thống ASP.NET Core 2.2 lên 3.1
Bài viết này mình đúc kết lại sau khi migrate toàn bộ hệ thống TEDU hiện tại từ .NET Core 2.2 lên 3.1 chia sẻ lại để mọi người cùng trao đổi
Đọc thêm
Tìm hiểu Unit Testing trong ASP.NET Core
Tiếp theo bài viết trước với tiêu đề Tìm hiểu về Dependency Injection trong ASP.NET Core. Hôm nay mình sẽ tập trung vào unit test.
Đọc thêm
Tìm hiểu về Dependency Injection trong ASP.NET Core
Bài viết này chúng ta sẽ cùng tìm hiểu về những điều thú vị xung quanh depedency injection và unit testing.
Đọc thêm
Cách sử dụng Yarn trong Visual Studio 2017
Cách sử dụng Yarn để quản lý các dependencies trong Visual Studio 2017
Đọc thêm