- Kết nối tổng hợp đượ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 ghép 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ề SQL Server Connection Pooling (ADO.NET))
- Không bao giờ sử dụng ngữ cảnh chung. ObjectContext nội bộ 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 ngữ cảnh toàn cầu là khác nhau đối với mỗi loại ứng dụng.
- Đối với các ứng dụng web, hãy sử dụng ngữ cảnh đơn theo yêu cầu. Đối với các dịch vụ web, hãy sử dụng ngữ cảnh đơn cho mỗi cuộc gọi. Trong ứng dụng WinForms hoặc WPF, hãy sử dụng ngữ cảnh đơn trên mỗi biểu mẫu hoặc cho mỗi người trình bày. Có thể có một số yêu cầu đặc biệt mà sẽ không cho phép sử dụng phương pháp này nhưng trong hầu hết trường hợp, điều 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 điều này article. Đó là về phiên NHibernate nhưng ý tưởng là như nhau.
Edit:
Khi bạn sử dụng EF nó bằng cách tải mặc định mỗi thực thể duy nhất một lần mỗi ngữ cảnh. Truy vấn đầu tiên tạo ra instace thực thể và lưu trữ nó trong nội bộ. Bất kỳ truy vấn tiếp theo nào yêu cầu thực thể có cùng khóa trả về phiên bả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. Điều nà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 cá thể được chia sẻ duy nhất.
Bất kỳ thay đổi nào được thực hiện cho đối tượng không được duy trì cho đến khi bạn gọi SaveChanges
trong ngữ cảnh. Bạn có thể thực hiện thay đổi trong nhiều thực thể và lưu trữ chúng cùng một lúc.Điều này được gọi là Đơn vị công việc mẫu. Bạn không thể chọn một cách chọn lọc đối tượng được đính kèm đã sửa đổi mà 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 thể hiện của thực thể cho toàn bộ ứng dụng. Bất kỳ thay đổi nào đối với thực thể ảnh hưởng đến toàn bộ ứng dụng ngay cả khi các thay đổi chưa được duy trì (cam kết). Trong hầu hết thời gian này không phải là những gì bạn muốn. Giả sử bạn có một biểu mẫu 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 chỉnh sửa phức tạp (thay đổi giá trị, thêm các 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 ngữ cảnh được chia sẻ. Bạn sẽ làm gì? Gợi ý: Tôi không biết về bất kỳ CancelChanges hoặc UndoChanges trên ObjectContext
.
Tôi nghĩ 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ể duy nhất trong số nhiều yêu cầu HTTP hoặc các cuộc gọi dịch vụ web làm cho ứng dụng của bạn vô dụng. Mọi yêu cầu chỉ 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 bởi vì bạn đang chia sẻ một đơn vị công việc trong số tất cả chúng. Điều này cũng sẽ có một vấn đề khác - ngữ cảnh và bất kỳ thao tác nào 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 ngữ cảnh không phải là luồng an toàn.
Ngay cả đối với ứng dụng chỉ đọc, ngữ cảnh chung không phải là lựa chọn tốt vì bạn có thể muốn dữ liệu mới mỗi khi bạn truy vấn ứng dụng.
Nguồn
2010-09-06 17:55:42
Cảm ơn bạn đã trả lời. Có lẽ bạn có thể giải thích tại sao việc sử dụng một bối cảnh toàn cục duy nhất là xấu? Nó làm cho truy cập song song khó khăn hơn, chắc chắn, nhưng những gì khác ...? – Noldorin
Ok, giờ đây rõ ràng hơn rất nhiều, cảm ơn bạn. Chỉ cần xác nhận, mặc dù bối cảnh toàn cầu chưa bao giờ thực sự thích hợp, một bối cảnh duy nhất cho một "hộp thoại chỉnh sửa" hoặc như vậy có thể là đúng cách? Trong các tình huống khác, như các dịch vụ web và ASP.NET, các ngữ cảnh bên trong các phương thức chỉ có ý nghĩa hơn. Về chính xác? – Noldorin
Tôi đã tư vấn của bạn và loại bỏ các singelton. Bây giờ tôi nhận được một lỗi khác: http://stackoverflow.com/questions/14795899/an-entity-object-cannot-be-referenced-by-multiple-instances-of-ientitychangetrac –