- Nhóm kết nối được xử lý như trong bất kỳ ứng dụng ADO.NET nào khác. Kết nối thực thể vẫn sử dụng kết nối cơ sở dữ liệu truyền thống với chuỗi kết nối truyền thống. Tôi tin rằng bạn có thể tắt kết nối kết nối trong chuỗi kết nối nếu bạn không muốn sử dụng nó. (đọc thêm về Nhóm kết nối máy chủ SQL (ADO.NET) )
- Không bao giờ sử dụng bối cảnh toàn cầu. ObjectContext bên trong thực hiện một số mẫu bao gồm Bản đồ nhận dạng và Đơn vị công việc. Tác động của việc sử dụng bối cảnh toàn cầu là khác nhau cho mỗi loại ứng dụng.
- Đối với các ứng dụng web sử dụng bối cảnh duy nhất cho mỗi yêu cầu. Đối với các dịch vụ web sử dụng bối cảnh duy nhất cho mỗi cuộc gọi. Trong ứng dụng WinForms hoặc WPF sử dụng ngữ cảnh đơn cho mỗi biểu mẫu hoặc mỗi người trình bày. Có thể có một số yêu cầu đặc biệt sẽ không cho phép sử dụng phương pháp này nhưng trong hầu hết tình huống này là đủ.
Nếu bạn muốn biết tác động nào có bối cảnh đối tượng đơn cho ứng dụng WPF / WinForm, hãy kiểm tra bài viết này . Đó là về NHibernate session nhưng ý tưởng là như nhau.
Biên tập:
Khi bạn sử dụng EF, theo mặc định, nó chỉ tải mỗi thực thể một lần cho mỗi ngữ cảnh. Truy vấn đầu tiên tạo ra instace thực thể và lưu trữ nó bên trong. Bất kỳ truy vấn tiếp theo nào yêu cầu thực thể có cùng khóa đều trả về thể hiện được lưu trữ này. Nếu các giá trị trong kho dữ liệu thay đổi, bạn vẫn nhận được thực thể với các giá trị từ truy vấn ban đầu. Đây được gọi là mẫu bản đồ nhận dạng . Bạn có thể buộc bối cảnh đối tượng tải lại thực thể nhưng nó sẽ tải lại một thể hiện được chia sẻ.
Mọi thay đổi được thực hiện cho thực thể sẽ không được duy trì cho đến khi bạn gọi SaveChanges
vào ngữ cảnh. Bạn có thể thay đổi trong nhiều thực thể và lưu trữ chúng cùng một lúc. Đây được gọi là mẫu Đơn vị công việc . Bạn không thể chọn lọc nói thực thể đính kèm nào bạn muốn lưu.
Kết hợp hai mẫu này và bạn sẽ thấy một số hiệu ứng thú vị. Bạn chỉ có một phiên bản thực thể cho toàn bộ ứng dụng. Mọi thay đổi đối với thực thể đều ảnh hưởng đến toàn bộ ứng dụng ngay cả khi những thay đổi chưa được duy trì (cam kết). Trong hầu hết các lần, đây không phải là điều bạn muốn. Giả sử rằng bạn có một hình thức chỉnh sửa trong ứng dụng WPF. Bạn đang làm việc với thực thể và bạn quyết định hủy bỏ chỉnh sửa phức tạp (thay đổi giá trị, thêm thực thể liên quan, xóa các thực thể liên quan khác, v.v.). Nhưng thực thể đã được sửa đổi trong bối cảnh chia sẻ. Bạn sẽ làm gì? Gợi ý: Tôi không biết về bất kỳ Hủy nào hoặc Hoàn tác trên ObjectContext
.
Tôi nghĩ rằng chúng ta không phải thảo luận về kịch bản máy chủ. Chỉ cần chia sẻ một thực thể giữa nhiều yêu cầu HTTP hoặc các cuộc gọi dịch vụ Web sẽ khiến ứng dụng của bạn trở nên vô dụng. Bất kỳ yêu cầu nào cũng có thể kích hoạt SaveChanges
và lưu một phần dữ liệu từ một yêu cầu khác vì bạn đang chia sẻ một đơn vị công việc giữa tất cả chúng. Điều này cũng sẽ có một vấn đề khác - bối cảnh và mọi thao tác với các thực thể trong ngữ cảnh hoặc kết nối cơ sở dữ liệu được sử dụng bởi bối cảnh không phải là luồng an toàn.
Ngay cả đối với một ứng dụng chỉ đọc, bối cảnh toàn cầu không phải là một lựa chọn tốt bởi vì bạn có thể muốn có dữ liệu mới mỗi khi bạn truy vấn ứng dụng.