Nếu bạn nói về proxy động trong EF có hai loại khác nhau để phân biệt:
- proxy để tải lười biếng
- Proxies cho sự thay đổi theo dõi
Thường là theo dõi sự thay đổi Proxy cũng có thể phục vụ như một proxy cho tải chậm. Điều ngược lại là không đúng sự thật. Điều này là do yêu cầu về proxy theo dõi thay đổi cao hơn, đặc biệt là tất cả các thuộc tính - cũng là thuộc tính vô hướng - phải là virtual
. Để tải chậm, điều đó đủ để các thuộc tính điều hướng là virtual
.
Thực tế là một sự thay đổi theo dõi Proxy luôn cũng cho phép tận dụng tải lười biếng là lý do chính tại sao DbContext có cờ cấu hình này:
DbContext.Configuration.LazyLoadingEnabled
Cờ này là đúng theo mặc định. Đặt nó thành false
sẽ tắt tải chậm ngay cả khi proxy được tạo. Điều này đặc biệt quan trọng nếu bạn đang làm việc với proxy thay đổi theo dõi nhưng không muốn sử dụng những proxy đó để tải xuống chậm.
Tùy chọn ...
DbContext.Configuration.ProxyCreationEnabled
... vô hiệu hóa việc tạo ủy quyền hoàn toàn - để theo dõi sự thay đổi và tải lười biếng là tốt.
Cả hai cờ chỉ có ý nghĩa nếu tất cả các lớp thực thể của bạn đáp ứng các yêu cầu để tạo theo dõi thay đổi hoặc proxy tải chậm.
Bây giờ, bạn biết mục đích của proxy tải động chậm. Vì vậy, tại sao một người nên sử dụng proxy theo dõi thay đổi động?
Thực ra, lý do duy nhất tôi biết là hiệu suất. Nhưng đây là một lý do rất mạnh. Việc so sánh theo dõi thay đổi dựa trên proxy với sự thay đổi theo dõi dựa trên proxy là khác nhau - từ các phép đo của tôi, hệ số 50 đến 100 là thực tế (lấy từ một phương pháp cần khoảng một giờ cho 10000 lần theo dõi thay đổi dựa trên chụp nhanh và 30 đến 60 giây sau khi thực hiện tất cả các thuộc tính ảo để bật proxy theo dõi thay đổi). Điều này là nhận được một yếu tố quan trọng nếu bạn có một số ứng dụng mà quá trình và thay đổi nhiều (nói hơn 1000) thực thể. Trong một ứng dụng web, nơi bạn có thể chỉ có các hoạt động Tạo/Thay đổi/Xóa trên các thực thể đơn lẻ trong một yêu cầu web, sự khác biệt này không quan trọng lắm.
Trong hầu hết các trường hợp, bạn có thể tận dụng tải mong muốn hoặc explicite để đạt được mục tiêu tương tự nếu bạn không muốn làm việc với proxy tải chậm. Hiệu suất cho tải dựa trên proxy tải chậm hoặc proxy không dựa trên proxy là giống nhau vì về cơ bản cùng một truy vấn xảy ra khi các thuộc tính điều hướng được tải - trong trường hợp đầu tiên proxy thực hiện truy vấn, trong trường hợp thứ hai mã viết tay của bạn. Vì vậy, bạn có thể sống mà không cần tải proxy lười biếng mà không làm mất nhiều. Nếu bạn muốn hiệu suất hợp lý để xử lý nhiều, nhiều thực thể không có thay thế cho thay đổi proxy theo dõi - ngoài việc sử dụng EntityObject
thực thể có nguồn gốc trong EF 4.0 (không phải là tùy chọn trong EF 4.1 vì nó bị cấm khi bạn sử dụng DbContext
) hoặc không sử dụng Entity Framework.
Chỉnh sửa (tháng 5 năm 2012)
Trong khi chờ đợi tôi đã học được rằng có những tình huống mà change tracking proxies không nhanh hơn hoặc thậm chí tồi tệ hơn trong hiệu suất so với ảnh chụp theo dõi dựa.
Do các biến chứng này khi sử dụng proxy theo dõi thay đổi, cách ưa thích là sử dụng theo dõi thay đổi dựa trên chụp nhanh theo mặc định và sử dụng proxy cẩn thận (sau khi thực hiện một số kiểm tra). nhanh hơn so với theo dõi thay đổi dựa trên ảnh chụp nhanh.
+1 - Sự cố serialization/deserialization là một nỗi đau! – StuartLC