Thứ Sáu, 29 tháng 6, 2012

Một số điểm cần lưu ý khi sử dụng EntityFramework


Entity Framework là một trong những công cụ ORM tốt nhất trong thế giới .NET. Nhờ có Entity Framework mà chúng ta có thể đơn giản hóa công việc truy xuất CSDL và giảm thời gian phát triển. Chính nhờ vậy, mà EntityFramework là một trong những công cụ ORM được dùng nhiều nhất trong thế giới .NET. Tuy nhiên, không phải lúc nào Entity Framework cũng tốt, và vì vậy, bạn cần phải lưu ý một số điểm khi sử dụng EF. Và điều đó càng quan trọng hơn khi bạn phát triển những dự án lớn, ở đó, mỗi sai lầm điều khiến bạn phải trả giá đắt.

EntityFramework được thiết kế áp dụng mẫu thiết kế Unit of Work

Unit of Work là mẫu thiết kế về truy xuất CSDL khá thông dụng. Khi áp dụng mẫu này,  chúng ta sẽ có một đối tượng theo dõi các thay đổi của dữ liệu, và đối tượng đó sẽ quản lý việt cập nhật những thay đổi đến CSDL.
Khi bạn sử dụng EF, bạn cần phải tạo một lớp ngữ cảnh kết thừa từ System.Data.Entity.DbContext. DbContext chính đối tượng UnitOfWork. Nó theo dõi những thay đổi của các đối tượng và chịu trách nhiệm cập nhật dữ liệu đến CSDL.
Điều này cũng có nghĩa là DbContext sẽ giữ bản sao chép cục bộ của dữ liệu (ở CSDL) với những thay đổi chưa được cập nhật, và do đó chúng ta cần phải lưu ý:

Đối tượng DBContext phải có thời gian sống ngắn

Mẫu Unit Of Work khuyên chúng ta nên có đối tượng UnitOfWork cho mỗi giao dịch. Bởi vì đối tượng này giữ bản sao của dữ liệu và những thay đổi của nó, cho nên nó phải nhanh chóng cập nhật CSDL để phòng trường hợp có truy vấn khác đến dữ liệu này.
Bạn hầu như không thể xử lý được mọi tình huống truy xuất/cập nhật đồng bộ. Nhưng việc giảm thời gian sống của DbContext càng ngắn càng tốt, bạn đang giảm nguy cơ xảy ra các mâu thuẫn khi xử lý đồng bộ như đã nêu trên.
Với lập trình web, bạn nên giữ đối tượng DbContext sống trong vòng đời một web request đến ứng dụng. Nếu bạn lấy lên quá nhiều dữ liệu, DbContext sẽ làm cho trang web của bạn chạy chậm lại, vì vậy chúng ta nên kết thúc vòng đời của DbContext càng sớm càng tốt, và vòng đời của DbContext được gắn với vòng đời của mỗi request là điều nên làm.
Việc tạo mới và hủy một đối tượng không làm chúng ta quá tốn kém CPU hay bộ nhớ, và bạn cùng cần nhớ rằng, việc hủy các đối tượng càng sớm càng tốt là một trong những kinh nghiệm tốt mà chúng ta nên tuân theo và đối tượng DbContext của EF cũng không phải là ngoại lệ.

Entity Framewok không xử lý các vấn đề truy xuất đồng bộ một cách mặc định

Hay nói một cách khác, chính sách xử lý các truy xuất đồng bộ của EF là “Ai ghi sau, người đó thắng”. Chính sách như vậy không hắn là chính sách tốt nhất. EF có hỗ trợ cơ chế quản lý truy xuất đồng bộ khắc khe hơn, khi bạn áp dụng cơ chế này, ngoại lệ sẽ phát sinh nếu bạn cố gắng cập nhật một đối tượng đang được điều chỉnh hoặc truy xuất. Chúng ta cần phải bắt lỗi này và quản lý lỗi.

Không có nhận xét nào: