Cập nhật: Tôi đã không sử dụng Entity Framework kể từ phiên bản 4.0, vì vậy câu trả lời của tôi có thể đã lỗi thời. Tôi vẫn đang sử dụng NH hoặc ADO .NET thuần túy trong các dự án của mình. Và tôi thậm chí không muốn xem có gì mới trong EF kể từ 4.0, bởi vì NH hoạt động hoàn hảo.
Trên thực tế, khá dễ dàng để so sánh chúng khi bạn đã sử dụng cả hai. Có một số hạn chế nghiêm trọng với EF4, tôi có thể kể tên một số hạn chế mà tôi gặp phải:
Các vấn đề về EF4:
- Háo hức Đang tải và định hình kết quả : Hệ thống tải háo hức EF4 (Bao gồm ("Đường dẫn")) tạo ra SQL không đúng, với phép lặp của JOIN, sẽ thực thi chậm hơn hàng nghìn (không phải theo nghĩa đen) thời gian đối với các mối quan hệ nhiều-nhiều sau đó viết tay SQL (đó là hiệu quả không sử dụng được).
- Materializer không thể hiện thực hóa các thực thể được liên kết : Nếu bạn có thể nghĩ rằng mình có thể khắc phục sự cố trước đó bằng cách cung cấp truy vấn SQL của riêng bạn, thì bạn đã nhầm. EF4 không thể hiện thực hóa (ánh xạ) các thực thể được liên kết từ truy vấn JOIN SQL, nó chỉ có thể tải dữ liệu từ một bảng (Vì vậy, nếu bạn có Order.Product, SELECT * FROM order LEFT JOIN Product sẽ chỉ khởi tạo đối tượng Order, Product sẽ vẫn trống, nghĩ rằng tất cả dữ liệu cần thiết được tìm nạp trong truy vấn để bắt nó). Điều này có thể được khắc phục bằng cách sử dụng tiện ích bổ sung cộng đồng EFExtensions, nhưng mã bạn sẽ phải viết cho điều này thực sự xấu (tôi đã thử).
Các thực thể tự theo dõi: Nhiều người nói rằng các thực thể Tự theo dõi rất thú vị để phát triển N-tier, bao gồm cả câu trả lời hàng đầu trong chủ đề này. Tôi nghĩ rằng tôi thậm chí chưa thử họ, tôi có thể nói rằng họ không. truy cập cơ sở sau đó? Bất kỳ cách nào bạn sẽ phải tải dữ liệu mà người dùng sắp thay đổi từ DB, hãy kiểm tra xem dữ liệu đó có tồn tại | không tồn tại hay không, kiểm tra quyền, v.v. Bạn không thể tin tưởng người dùng về trạng thái thực thể mà anh ta đang gửi đến máy chủ, bạn vẫn sẽ phải tải thực thể này từ DB và xác định trạng thái của nó và những thứ khác, vì vậy thông tin này là vô ích, cũng như các thực thể Tự theo dõi trừ khi bạn tạo một hệ thống n-tier riêng đáng tin cậy để sử dụng nội bộ, trong trường hợp đó, bạn có thể cung cấp đơn giản Quyền truy cập DB.
Ghi nhật ký, Sự kiện, tích hợp logic nghiệp vụ: EF4 giống như hộp đen, nó làm một việc gì đó và bạn không biết nó làm gì. Chỉ có một sự kiện OnSavingChanges nơi bạn có thể đặt một số logic nghiệp vụ mà bạn cần chạy trước khi điều gì đó xảy ra với DB và nếu bạn cần áp dụng một số thay đổi cho các đối tượng nghiệp vụ trước khi điều gì đó xảy ra, bạn sẽ phải tìm hiểu trong ObjectStateManager, và điều này thực sự xấu xí , mã có thể trở nên rất lớn. Ví dụ: nếu bạn sử dụng mẫu Kho lưu trữ và những gì sẽ được thông báo về các thay đổi được thực hiện đối với DB theo cách đối tượng sạch, bạn sẽ gặp khó khăn khi thực hiện điều này với EF.
Khả năng mở rộng: Tất cả mã EF là riêng tư và nội bộ, nếu bạn không thích điều gì đó (và bạn sẽ không thích RẤT NHIỀU nếu bạn nghiêm túc về việc sử dụng EF), không có cách nào bạn sẽ thay đổi điều này một cách dễ dàng, trên thực tế, tôi chắc chắn việc viết ORM của riêng bạn từ đầu sẽ dễ dàng hơn (tôi đã làm) sau đó làm cho EF hoạt động như bạn cần. Ví dụ, hãy xem nguồn EFExtensions, nó dựa trên các phương thức mở rộng và các "hack" khác nhau để làm cho EF dễ sử dụng hơn một chút và mã này khá xấu (và đó không phải là lỗi của tác giả, khi mọi thứ trong EF là riêng tư thì đây là điều duy nhất cách để mở rộng nó).
Tôi có thể tiếp tục viết những điều tồi tệ về EF và tôi đã cảm thấy đau đớn như thế nào khi làm việc với nó trong 20 trang, và có lẽ tôi sẽ làm vậy.
Còn NHibernate thì sao? Đó là một cấp độ hoàn toàn khác, nó giống như so sánh PHP với C #, EF4 giống như trong thời kỳ đồ đá, nó giống như EF chậm hơn 10 năm so với NHibernate trong quá trình phát triển, và thực tế là như vậy, Hibernate được bắt đầu vào năm 2001. Nếu bạn có thời gian rảnh để tìm hiểu và bật Nhibernate, hãy thực hiện.