2009-12-22 46 views
5

Chúng tôi đang viết một ứng dụng WPF bằng cách sử dụng khung Entity (Silverlight với các dịch vụ RIA chính xác). Chúng tôi đang sử dụng một ObjectContext được chia sẻ thông qua ứng dụng để chúng tôi có thể hưởng lợi từ việc chia sẻ dữ liệu trên các mô-đun.Entity Framework ObjectContext trong windows/WPF/ứng dụng Silverlight

Vấn đề là - nếu người dùng trong công việc của mình mở ra, giả sử bán hàng lịch sử, nó được tải vào ObjectContext và ở đó cho đến khi kết thúc ứng dụng. Vì vậy, một mô hình khác nên được sử dụng.

Tôi biết rằng ObjectContexts nên được sử dụng làm Đơn vị hoạt động đơn lẻ. Nhưng sau đó, làm thế nào để bạn cho các phần khác của ứng dụng biết rằng một cái gì đó đã thay đổi và họ nên tải lại dữ liệu của họ?

Chỉnh sửa: Ok, EventAggregator, nhưng sau đó, điều này sẽ khiến tất cả các phần khác tải lại dữ liệu của chúng (có thể trùng lặp nhiều). Cũng có lẽ nhiều sự kiện sẽ là cần thiết cho tất cả các loại nhóm tham gia.

Bạn giải quyết những vấn đề này như thế nào? Giải pháp hiện tại của tôi là một loại thỏa hiệp - sử dụng một ObjectContext được chia sẻ cho dữ liệu cốt lõi được sử dụng bởi toàn bộ appliaction để chúng có thể được chia sẻ và cập nhật tự động. Và đối với số lượng lớn dữ liệu, hãy sử dụng một ObjectContext riêng biệt mới. Bất kỳ ý tưởng tốt hơn?

Có cách nào để "giải phóng" các thực thể khỏi DataContext của họ sao cho bộ gom rác có thể thực hiện công việc của nó và giải phóng bộ nhớ?

Trả lời

2

Chờ, có phải WPF hoặc Silverlight không? Trong trường hợp này, chúng rất khác nhau và câu trả lời của tôi sẽ khác.

WPF Giải pháp

Trong WPF tôi sẽ tạo ra một ObjectContext duy nhất cho mỗi hình thức. Bằng cách này, ngữ cảnh sẽ chỉ kéo dài miễn là bản thân biểu mẫu. Sau đó, bạn nên triển khai một hệ thống sự kiện để khi bạn lưu thay đổi đối với một thực thể, bạn có thể cảnh báo các biểu mẫu khác mà chúng có thể cần phải làm mới dữ liệu của chúng (ví dụ: INotifyPropertyChanged). Oren Eini wrote a pretty good article on this architecture using NHibernate in MSDN magazine. Bạn sẽ có thể có được khái niệm kiến ​​trúc từ bài viết của mình.

Silverlight Giải pháp

Bây giờ, Silverlight là khác nhau. Silverlight về cơ bản chỉ cho phép bạn có một biểu mẫu trong ứng dụng của mình. Có, có một số thủ thuật bạn có thể làm để điều hướng hình ảnh gốc của biểu mẫu thành các "trang" khác nhau nhưng nó vẫn chỉ là một biểu mẫu và người dùng không thể mở nhiều cửa sổ trong một Silverlight RIA. Bởi vì điều này, Tôi sẽ tạo một .Net RIA Services ObjectContext trên mỗi phiên bản Silverlight RIA. Hãy nhớ rằng, RIA Services không phải là một kết nối thực sự với cơ sở dữ liệu của bạn, nó chỉ là một đối tượng theo dõi bộ nhớ đệm và thay đổi được liên kết với một dịch vụ web. Vì vậy, nó là hoàn toàn chấp nhận được để lại đối tượng này trong sự tồn tại trong thời gian dài hơn vì nó không phải là buộc lên bất kỳ tài nguyên máy chủ. Nếu Silverlight RIA của bạn mở nhiều cửa sổ trình duyệt hoặc có nhiều hơn một đối tượng Silverlight, thì bạn nên có một ObjectContext trên mỗi phiên bản Silverlight.

Trên máy chủ, bạn sử dụng Đối tượng khung thực thể khung nội dung trong dịch vụ web và chỉ nên sống trong khoảng thời gian của một yêu cầu. Bạn càng có nhiều dịch vụ, bạn càng có nhiều khả năng mở rộng và hiệu quả hơn. Bạn muốn mở EF ObjectContext, sử dụng nó và đóng nó càng sớm càng tốt.


EDIT:

Nếu tất cả các bạn đang muốn làm là tách một đối tượng từ bối cảnh đối tượng, sau đó bạn chỉ có thể sử dụng phương pháp context.Detach(entity). Bạn có thể tìm thấy example of how to do this on MSDN.

+0

Với ứng dụng này, chúng ta đang nói về Silverlight. Sử dụng Prism/Caliburn, tôi tin rằng nó không phải là một vấn đề để có một ObjectContext duy nhất cho mỗi lần xem (module?). Một lần nữa, vấn đề là gì nếu có rất nhiều dữ liệu được nạp cho khách hàng? Theo tôi bây giờ, giải pháp tốt nhất là tạo một ObjectContext được chia sẻ cho các thực thể cơ bản được sử dụng thông qua toàn bộ ứng dụng để chúng được đồng bộ hóa tự động và ObjectContexts riêng biệt để tải khối dữ liệu lớn. một số báo cáo lịch sử. – gius

+0

Tôi sẽ không cố gửi các khối dữ liệu thực sự lớn tới khách hàng. Thay vào đó, tôi sẽ lọc trên máy chủ và chỉ trả lại kết quả mà khách hàng muốn xem tại thời điểm đó. Con người không thể đọc 100.000 hồ sơ, vì vậy đừng gửi nhiều thứ đó cho một con người. Thay vào đó, hãy để vấn đề tìm kiếm/lọc và chỉ gửi kết quả cho khách hàng. Nếu bạn đang xây dựng các báo cáo, hãy tạo dữ liệu tóm tắt tổng hợp trên máy chủ. Ví dụ, sẽ tốt hơn nếu tính doanh số bán hàng hàng tháng trên máy chủ và gửi một số duy nhất cho khách hàng hơn là để xem 5000 hồ sơ bán hàng. –

+0

Đó là sự thật, nhưng nếu người dùng thấy bất cứ lúc nào trong suốt thời gian ứng dụng, hãy nói các trang 1, 10, 20, những dữ liệu đó sẽ vẫn nằm trong bộ nhớ. Mặt khác, bằng cách sử dụng một ObjectContext riêng biệt và phân trang dữ liệu có thể giải quyết vấn đề lớn dữ liệu-lưu-trong-bộ nhớ. – gius

1

Bạn có thể sử dụng mẫu kho lưu trữ. Một lớp trừu tượng bổ sung giữa UI và DAL.

Tạo bộ sưu tập dữ liệu trong kho lưu trữ tĩnh và có thể quan sát được. Sau đó, bất cứ khi nào kho lưu trữ cập nhật bất kỳ trong số chúng, lớp giao diện người dùng sẽ bắt kịp. JUst một ý tưởng.

+0

này không giải quyết vấn đề của tôi - những bộ sưu tập sẽ ở lại trên máy khách, vì vậy nếu có ví dụ là 1GB dữ liệu trong cơ sở dữ liệu, sớm hay muộn, nó cũng sẽ được tải trên máy khách. Mặt khác, điều này có thể hiển thị một giải pháp khả thi. Cảm ơn ý tưởng! – gius

0

Sử dụng ObservableCollections trong ObjectContext. Sử dụng một sự kiện kích hoạt trên NotifyPropertyChange. Sử dụng mẫu xuất bản/đăng ký giữa các mô hình chế độ xem để thông báo cho họ về thay đổi và sử dụng mẫu này để cập nhật các chế độ xem khác.

+1

Tất cả các bộ sưu tập được tạo bởi EF là ObservableCollection và các đối tượng sử dụng NotifyPropertyChanged. Vấn đề là tôi không thể chỉ sử dụng ObjectContext trong toàn bộ vòng đời ứng dụng vì sau đó không có dữ liệu nào sẽ được giải phóng khỏi bộ nhớ khi chúng được nạp vào appliaction. Mặt khác, việc sử dụng ObjectContext riêng biệt cho mỗi hành động sẽ gây ra các vấn đề trong dữ liệu làm mới - cùng một dữ liệu sẽ được tải nhiều lần từ nhiều nơi và đồng bộ hóa có nghĩa là sự kiện tùy chỉnh cho mọi loại dữ liệu. Câu hỏi chính là wheter có bất kỳ khung/mẫu cho vấn đề này. – gius

Các vấn đề liên quan