Nếu bạn đang giữ một dự án .NET chạy trên Entity Framework và thấy trang danh sách chậm dần theo số bản ghi, thì bạn đang đứng đúng chỗ mà đội ngũ bên mình từng đứng. Năm 2026, EF Core vẫn là ORM chủ đạo cho backend .NET. Câu hỏi thật sự là nên bám theo xu hướng nào, và xu hướng nào chỉ là tiếng ồn.
Dưới đây là năm xu hướng mà chúng tôi chọn. Với mỗi xu hướng, chúng tôi giải thích nó là gì, vì sao hiệu quả, cách áp dụng và những đánh đổi đi kèm. Mục tiêu là để bạn đọc xong có thể mở code của mình ra và kiểm tra ngay.
Trả lời nhanh: 5 xu hướng Entity Framework đáng theo dõi
Năm xu hướng đó gồm tối ưu truy vấn và loại bỏ N+1, tách rõ đọc và ghi bằng no-tracking, dùng compiled query kèm cache có kiểm soát, quản lý migration theo quy trình, và kết hợp EF Core với Dapper cho truy vấn nặng.
Chúng tôi chọn chúng dựa trên ba tiêu chí. Tiêu chí đầu là tác động thực tế tới dự án. Tiêu chí thứ hai là mức độ phổ biến trong cộng đồng .NET. Tiêu chí cuối là khả năng áp dụng ngay mà không cần viết lại cả hệ thống. Trước khi nâng cấp phiên bản, bạn nên đối chiếu lại với release notes chính thức của Microsoft.
Chúng tôi chọn xu hướng theo tiêu chí nào?
Chúng tôi không muốn lập một danh sách chỉ để đẹp mắt. Mỗi xu hướng phải chạm được vào cách bạn viết và vận hành truy vấn dữ liệu. Một tính năng mới nghe hấp dẫn nhưng không đổi được gì trong code hằng ngày thì không đáng đưa vào.
Tiêu chí về quy mô cũng quan trọng. Nhiều bài viết chỉ nói về hệ thống hàng triệu bản ghi. Nhưng dự án vừa và nhỏ cũng dính đúng những lỗi đó, chỉ là ở mức nhẹ hơn. Vì vậy, chúng tôi ưu tiên những thứ áp dụng được ở cả hai đầu.
Cuối cùng, không có kỹ thuật nào miễn phí. Mỗi cách làm đều đổi lấy thứ gì đó. Nếu một cách làm mang lại tốc độ, bạn phải biết nó đang lấy đi điều gì, ví dụ sự tiện lợi khi cập nhật entity hay độ đơn giản của kiến trúc.
Xu hướng 1: Tối ưu truy vấn và loại bỏ N+1 ngay từ thiết kế
N+1 xảy ra khi code lấy một danh sách, rồi với mỗi phần tử lại chạy thêm một truy vấn để lấy dữ liệu liên quan. Lấy 100 đơn hàng mà mỗi đơn cần thông tin khách hàng thì thành 101 câu SQL. Lỗi này rất hay gặp vì nó không văng exception nào. Hệ thống chỉ chậm dần theo thời gian, và người phát hiện thường là khách hàng.
Đội ngũ bên mình từng gặp một màn hình danh sách đơn hàng chỉ có vài dòng LINQ, nhìn rất gọn. Khi mở SQL ra, số câu truy vấn gấp hơn trăm lần số dòng hiển thị. Vì thế, việc đọc SQL sinh ra đã trở thành bước bắt buộc khi review, đặc biệt với các màn hình danh sách.
Cách sửa thường là dùng Include hoặc Select có chủ đích để lấy đủ dữ liệu liên quan trong một lần truy vấn. Khi chỉ cần vài trường, hãy chiếu sang một DTO thay vì kéo cả entity về. Hạn chế là bạn không thể chỉ dựa vào cảm giác. Hãy bật log SQL, đếm số câu truy vấn, rồi mới kết luận.
Xu hướng 2: Tách rõ đọc và ghi bằng AsNoTracking
Mặc định, EF theo dõi mọi entity bạn lấy ra để biết khi nào cần cập nhật. Điều này hữu ích khi bạn định sửa dữ liệu. Nhưng với một truy vấn chỉ để hiển thị, nó tốn bộ nhớ và thời gian một cách vô ích.
Bên mình đã đổi thói quen: truy vấn chỉ đọc mặc định dùng AsNoTracking. Với API trả danh sách hoặc báo cáo, sự khác biệt về tốc độ và bộ nhớ thường thấy rõ ngay trong lần đo đầu tiên. Đây là thay đổi ít rủi ro nhất bạn có thể làm hôm nay.
Có một điều cần nhớ: entity lấy ra theo kiểu này không được EF theo dõi, nên bạn không thể gọi SaveChanges để cập nhật chúng. Muốn sửa thì phải truy vấn lại theo cách có tracking. Đừng cố đảo ngược quyết định này giữa chừng trong một hàm xử lý.
Xu hướng 3: Compiled query và cache có chiến lược
Compiled query giúp EF không phải dựng lại cây biểu thức mỗi lần chạy một câu LINQ giống hệt nhau. Nếu một truy vấn được gọi hàng nghìn lần mỗi phút, lợi ích sẽ thấy rõ. Cách dùng là khai báo một delegate được biên dịch sẵn một lần, rồi gọi lại nhiều lần với tham số khác nhau.
Cache kết quả là chuyện khác và cần cẩn trọng hơn. Chỉ nên cache dữ liệu ít thay đổi, chẳng hạn danh mục, cấu hình hay bảng tra cứu. Với dữ liệu biến động, cache vừa khó đồng bộ vừa dễ gây lỗi khó hiểu cho người dùng.
- Quyết định thời gian sống (TTL) của cache ngay từ đầu.
- Xóa cache khi dữ liệu gốc thay đổi, không chỉ chờ hết hạn.
- Ghi lại key cache để dễ kiểm tra khi có báo lỗi.
Nếu không có kế hoạch rõ ràng về thời điểm xóa và nạp lại, hệ thống sẽ trả dữ liệu cũ mà không ai hay biết. Đó là lỗi rất khó truy vết vì mọi thứ trông vẫn chạy bình thường.
Xu hướng 4: Migration có quy trình, chạy qua CI/CD
Trước đây, nhiều đội chạy migration bằng tay trên máy cá nhân. Hệ quả là hai người tạo hai migration cùng lúc, hoặc một cột bị xóa trên môi trường này nhưng vẫn còn trên môi trường kia. Xu hướng hiện nay là đưa migration vào code review và để pipeline chạy theo thứ tự đã định.
Cách làm này đặc biệt đáng giá với đội làm việc nhiều người và có nhiều môi trường như staging và production. Mỗi thay đổi schema khi đó đều có người đọc và có dấu vết rõ ràng trong lịch sử commit.
Mặt trái cũng cần nhìn nhận. Migration đòi hỏi kỷ luật nhóm, và một migration sai trên dữ liệu thật có thể rất khó hoàn tác. Bên mình luôn thử trên một bản sao dữ liệu trước khi đụng tới production, và luôn viết kịch bản rollback trước khi chạy.
Xu hướng 5: EF Core kết hợp Dapper cho báo cáo nặng
Dapper là micro-ORM rất nhẹ, cho phép bạn viết SQL và nhận lại đối tượng với chi phí thấp. Mô hình lai là dùng EF cho các nghiệp vụ ghi, còn báo cáo phức tạp với nhiều phép join và tổng hợp thì giao cho Dapper hoặc SQL thuần.
Cách này hợp với hệ thống vừa có giao dịch vừa có báo cáo nặng. Bạn không cần ép EF làm mọi việc, vì đó không phải thế mạnh của nó. Với thao tác ghi cần theo dõi thay đổi, EF Core vẫn là lựa chọn tự nhiên. Với báo cáo cần kiểm soát chính xác từng câu lệnh, Dapper cho bạn quyền đó.
Đánh đổi là độ phức tạp kiến trúc tăng lên. Nhóm cần thống nhất quy ước: khi nào dùng công cụ nào, đặt code SQL thô ở đâu, và ai chịu trách nhiệm giữ schema đồng bộ giữa hai bên.
Cách bắt đầu áp dụng trong dự án thực tế
Bước đầu tiên là đo. Bật log SQL hoặc dùng công cụ profiling để tìm những truy vấn chậm nhất và những endpoint sinh ra nhiều câu SQL nhất. Đừng sửa thứ bạn chỉ đoán là chậm. Ghi lại số liệu trước khi thay đổi để có điểm so sánh.
Bước thứ hai là làm những việc ít rủi ro nhất. Thêm AsNoTracking cho truy vấn chỉ đọc và sửa các trường hợp N+1 rõ ràng. Hai việc này thường không đụng tới logic nghiệp vụ, nên dễ review và dễ hoàn tác.
Bước thứ ba là thử trên staging rồi mới đưa lên production. Đo lại sau mỗi thay đổi để chắc rằng bạn thực sự cải thiện, chứ không chỉ dời vấn đề sang chỗ khác. Nếu muốn đối chiếu code hiện tại với một danh sách lỗi thường gặp, bạn có thể đọc các sai lầm thường gặp khi dùng Entity Framework. Khi đã quen với tư duy đo đạc, bạn sẽ thấy việc theo dõi các thủ thuật lập trình hằng ngày cho dev .NET cũng giúp giữ thói quen viết code gọn và dễ kiểm chứng.
Nếu dự án của bạn cần một đối tác để xây dựng backend từ đầu, bạn có thể tham khảo các đơn vị phát triển website trước khi quyết định. Dù chọn cách nào, hãy đảm bảo đội làm việc có quy trình đo đạc rõ ràng.
Sai lầm khi theo các xu hướng EF mới
Sai lầm đầu tiên là nâng cấp phiên bản chỉ vì trend. Nâng cấp EF Core kéo theo kiểm tra tương thích với provider, thư viện bên thứ ba và cách hành xử của một số truy vấn. Hãy làm việc đó trên một nhánh riêng, có bộ test đi kèm.
Sai lầm thứ hai là cache dữ liệu thay đổi liên tục. Người dùng sẽ thấy số liệu lệch nhau giữa các màn hình, và rất khó tìm ra nguyên nhân gốc.
Sai lầm thứ ba là bỏ qua kiểm thử migration trên bản sao dữ liệu. Migration chạy tốt trên database rỗng không có nghĩa là nó an toàn với dữ liệu thật.
Câu hỏi thường gặp
Entity Framework có còn đáng học năm 2026 không?
Có. EF Core vẫn là ORM chính thống của hệ sinh thái .NET và được đầu tư đều đặn. Điều đáng học hơn cả là cách đọc SQL sinh ra và hiểu cơ chế tracking, vì đó là phần quyết định hiệu năng trong thực tế.
Nên nâng cấp EF Core ngay hay chờ bản ổn định?
Với dự án đang chạy ổn, nên chờ đến khi bản mới đã qua một thời gian đủ dài và các thư viện đi kèm đã tương thích. Với dự án mới, hãy dùng bản ổn định gần nhất và theo dõi release notes.
Dự án nhỏ có cần áp dụng hết các xu hướng này không?
Không cần. Với dự án nhỏ, bạn chỉ nên bắt đầu từ việc đo, sửa N+1 và dùng AsNoTracking. Compiled query, cache hay mô hình lai với Dapper chỉ đáng đầu tư khi gặp đúng vấn đề mà chúng giải quyết.
Làm sao biết truy vấn EF của mình đang bị N+1?
Hãy bật log SQL trong môi trường phát triển rồi chạy một màn hình danh sách. Nếu bạn thấy một câu lấy danh sách theo sau là hàng loạt câu giống nhau chỉ khác tham số, đó chính là N+1. Công cụ profiling cho kết quả tương tự.
Dapper và EF Core nên chọn cái nào cho báo cáo?
Với báo cáo phức tạp, nhiều join và tổng hợp, Dapper hoặc SQL thuần thường gọn và nhanh hơn vì bạn kiểm soát chính xác câu lệnh. EF Core vẫn phù hợp cho truy vấn đơn giản và các nghiệp vụ cần theo dõi thay đổi. Việc chọn công cụ tùy thuộc vào độ phức tạp của từng báo cáo cụ thể.

