Dưới đây là tóm tắt + ý chính + những đề xuất nâng cao mình rút ra từ bài viết “Entity Framework Core vs. Dapper?” trên blog Stackademic, cùng với vài góp ý mở rộng:
Tóm tắt & ý chính
1. Giới thiệu & mục đích
- Bài viết mở đầu bằng việc nhấn mạnh rằng ORM (Object-Relational Mapping) là lớp trung gian giúp ánh xạ giữa đối tượng trong code và bảng dữ liệu trong cơ sở dữ liệu — giảm bớt việc viết SQL thuần, tăng năng suất, bảo mật, và dễ bảo trì hơn.
- Tác giả đặt vấn đề so sánh giữa hai giải pháp phổ biến trong hệ sinh thái .NET: Entity Framework Core (EF Core) và Dapper.
2. Định nghĩa & ưu nhược điểm của từng công cụ
Dapper (“micro-ORM” nhẹ)
Ưu điểm:
- Hiệu năng cao, overhead thấp — rất thích hợp khi yêu cầu truy xuất dữ liệu nhanh trong môi trường có độ tải cao.
- Kiểm soát tốt hơn SQL (bạn viết truy vấn rõ ràng, mapping minh bạch).
- Dễ tiếp cận nếu bạn đã quen SQL — đường cong học thấp.
- Code minh bạch, ít “ẩn”, dễ theo dõi hành vi của truy vấn.
Hạn chế (ngầm hiểu từ bài viết):
- Cần viết nhiều boilerplate hơn khi mô hình dữ liệu phức tạp.
- Không có hỗ trợ sẵn ví dụ như change tracking, migration, lazy loading, query tối ưu tự động, v.v.
- Khi quy mô ứng dụng tăng lên, việc quản lý các truy vấn SQL rời rạc có thể trở nên cồng kềnh.
Entity Framework Core
Ưu điểm:
- Linh hoạt trong cách thiết lập mô hình: hỗ trợ Database-First, Code-First, Model-First.
- Tích hợp tốt với LINQ (truy vấn biểu thức C#, dịch về SQL).
- Hỗ trợ change tracking tự động: bạn chỉ cần thao tác với đối tượng, EF sẽ phát hiện và cập nhật.
- Hỗ trợ migration — giúp thay đổi cấu trúc DB dễ dàng khi yêu cầu schema thay đổi.
- Giúp giảm boilerplate code trong CRUD và quản lý quan hệ giữa các thực thể.
Hạn chế (ngầm hiểu / từ kinh nghiệm chung):
- Overhead so với Dapper — có thể chậm hơn khi thực hiện truy vấn phức tạp hoặc nhiều join lớn.
- “Black box” đôi khi khó chẩn đoán truy vấn SQL sinh ra có tối ưu hay không.
- Việc tuning performance (ví dụ tối ưu eager loading, lazy loading, tracking vs no-tracking) đòi hỏi kiến thức và kinh nghiệm.
3. Khi nào chọn cái nào
Bài viết đưa ra các gợi ý quyết định:
Chọn Dapper nếu:
- Cần hiệu năng cao, truy vấn dữ liệu nhanh.
- Các thao tác là CRUD đơn giản, không nhiều logic phức tạp trong tầng dữ liệu.
- Muốn kiểm soát SQL rõ ràng, hoặc cần kết hợp truy vấn raw SQL.
- Dự án nhỏ hoặc vừa, hoặc những phần “nặng” cần tối ưu hiệu suất cao.
Chọn EF Core nếu:
- Dự án lớn, với nhiều thực thể, quan hệ phức tạp.
- Cần migration, thay đổi schema thường xuyên.
- Muốn tận dụng LINQ, giúp code dễ đọc, dễ bảo trì.
- Muốn giảm boilerplate và làm việc chủ yếu qua mô hình đối tượng hơn.
4. Kết luận của bài viết
- Không có “chọn cái nào luôn tốt hơn” — lựa chọn phụ thuộc vào yêu cầu dự án, độ phức tạp của mô hình dữ liệu, ưu tiên giữa hiệu năng vs năng suất, và kinh nghiệm của team / developer.
- Tác giả cá nhân nghiêng về lựa chọn cân bằng giữa performance và productivity (hiệu năng + khả năng phát triển).
Đề xuất nâng cao / bổ sung
Dưới đây là những gợi ý bổ sung (mình nghĩ nếu tác giả mở rộng hoặc nếu bạn áp dụng thực tế) để bài viết trở nên sâu, thực dụng hơn:
- So sánh số liệu thực tế (benchmark)
- Thêm các thử nghiệm benchmark giữa EF Core và Dapper trong các tình huống thực tế: truy vấn đơn giản, join nhiều bảng, insert/update hàng loạt, paging, v.v.
- Phân tích chi tiết các trường hợp mà EF quá chậm so với Dapper, và khả năng tối ưu của EF trong những trường hợp đó.
- Trường hợp hỗn hợp (Hybrid)
- Nói về cách kết hợp cả EF Core lẫn Dapper trong cùng một dự án: dùng EF Core cho phần đa số, Dapper cho các truy vấn “nặng” cần tối ưu cao.
- Ví dụ mẫu code hoặc cấu trúc tổ chức repository để tách riêng phần tối ưu cao bằng Dapper.
- Chiến lược tối ưu với EF Core
- Giới thiệu các kỹ thuật tuning EF:
- Sử dụng
AsNoTrackingkhi không cần tracking - Tối ưu loading (eager vs lazy vs explicit)
- Batch Insert / Update
- Tối ưu truy vấn LINQ để tránh Cartesian explosion
- Sử dụng raw SQL / stored procedure khi cần
- Sử dụng
- Cảnh báo các “cạm bẫy” thường gặp (truy vấn N+1, eager load quá nhiều, tracking overhead).
- Giới thiệu các kỹ thuật tuning EF:
- Cập nhật phiên bản & tương lai
- Nhấn mạnh phiên bản EF Core nào (ví dụ EF Core 7, 8) và các cải tiến mới — vì mỗi phiên bản có thể cải thiện hiệu năng, hoặc thêm tính năng mới.
- So sánh sự hỗ trợ cộng đồng, tài liệu, và trend hiện nay (có nhiều người chuyển sang micro-ORM hoặc các công cụ mới).
- Trải nghiệm và chi phí bảo trì
- Phân tích chi phí phát triển, bảo trì, debugging. Ví dụ: khi dùng Dapper, mỗi truy vấn là thủ công — dễ sai sót, khó bảo trì; EF cho phép refactor dễ hơn.
- Trải nghiệm của dev khi làm code review, debug SQL, theo dõi truy vấn, logging, profiling.
- Tình huống đặc biệt & các công cụ khác
- Thảo luận về các tình huống đặc biệt: Query dựng động (dynamic SQL), bulk operations (hàng nghìn row), caching, concurrency, transaction scope.
- So sánh với các ORM khác / micro-ORM khác (ví dụ: Repo pattern, NHibernate, hoặc các thư viện như Dapper Plus, OrmLite, v.v.).
- Đề cập đến việc sử dụng CQRS / DDD, trong đó truy vấn (read) có thể dùng Dapper, còn phần command có thể dùng EF.
- Case study thực tế
- Giới thiệu một hoặc vài case study thực tế (project, yêu cầu, quyết định dùng cái nào, kết quả, bài học) để người đọc dễ hình dung.


















