2010-05-20 21 views
7

Tôi đang ở giữa sự phát triển của một ứng dụng WPF đang sử dụng Entity Framework (.NET 3.5). Nó truy cập các thực thể ở nhiều nơi trong suốt. Tôi lo lắng về tính nhất quán trong suốt ứng dụng liên quan đến các thực thể. Tôi có nên xây dựng bối cảnh riêng biệt trong các quan điểm khác nhau của mình hay tôi nên (và là một cách hay để thực hiện điều này), ví dụ một bối cảnh duy nhất có thể được truy cập trên toàn cầu? Ví dụ, mô hình thực thể của tôi có ba phần, lô hàng (với gói con và nội dung con thêm), Công ty/Danh bạ (có địa chỉ và điện thoại con) và thông số đĩa. Các giao diện của lô hàng và EditShipment truy cập vào DiskSpecs, và OptionsView quản lý DiskSpecs (Tạo, Chỉnh sửa, Xóa). Nếu tôi chỉnh sửa một DiskSpec, tôi phải có một cái gì đó trong ShipmentsView để lấy các thông số kỹ thuật mới nhất nếu tôi có bối cảnh riêng biệt phải không?Khung thực thể toàn cầu Ngữ cảnh trong ứng dụng WPF

Nếu an toàn để có một bối cảnh tổng thể mà từ đó phần còn lại của ứng dụng truy xuất đối tượng của nó, thì tôi tưởng tượng đó là con đường để đi. Nếu vậy, trường hợp đó sẽ được đặt ở đâu? Tôi đang sử dụng VB.NET, nhưng tôi có thể dịch từ C# khá tốt. Bất kỳ trợ giúp sẽ được đánh giá cao.

Tôi chỉ không muốn một trong những ứng dụng mà người dùng phải nhấn tải lại hàng tá lần trong các phần khác nhau của ứng dụng để nhận dữ liệu mới.

Cập nhật:

OK vì vậy tôi đã thay đổi ứng dụng của tôi như sau:

  1. Tất cả bối cảnh được tạo ra trong Sử dụng khối để xử lý trong số họ sau khi họ không còn cần thiết.
  2. Khi được tải, tất cả các thực thể sẽ bị xóa khỏi ngữ cảnh trước khi được xử lý.
  3. Một thuộc tính mới trong MainViewModel (ContextUpdated) đặt ra một sự kiện mà tất cả các ViewModels khác đăng ký để chạy phương thức ViewModels RefreshEntities đó.
  4. Sau khi triển khai điều này, tôi bắt đầu nhận được lỗi nói rằng một thực thể chỉ có thể được tham chiếu bởi một ChangeTracker tại một thời điểm. Vì tôi không thể tìm ra bối cảnh nào vẫn đang tham chiếu đến thực thể (không phải là bất kỳ ngữ cảnh nào?) Tôi đưa đối tượng là IEntityWithChangeTracker và đặt SetChangeTracker thành không có gì (Null).

Điều này đã cho vấn đề hiện tại: Khi tôi Null changeTracker trên thực thể, sau đó đính kèm nó vào một ngữ cảnh, nó mất trạng thái đã thay đổi và không được cập nhật vào cơ sở dữ liệu. Tuy nhiên, nếu tôi không thay đổi trình theo dõi thay đổi, tôi không thể đính kèm. Tôi có mã theo dõi thay đổi của riêng mình, vì vậy đó không phải là vấn đề.

Câu hỏi mới của tôi là, bạn phải làm như thế nào. Một ví dụ tốt Thực thể truy vấn và thực thể lưu mã bị mất sẽ đi một chặng đường dài, bởi vì tôi đang đập đầu của tôi trong cố gắng để có được những gì tôi từng nghĩ là một giao dịch đơn giản để làm việc.

+0

Nếu bạn downvote, tôi rất thích một lời giải thích. Ít nhất nó sẽ cho tôi biết những gì không làm tiếp tục xuống đường. – CodeWarrior

Trả lời

5

Ngữ cảnh tĩnh toàn cục hiếm khi là câu trả lời đúng. Hãy xem xét điều gì sẽ xảy ra nếu cơ sở dữ liệu được đặt lại trong khi thực hiện ứng dụng này - kết nối SQL của bạn đã biến mất và tất cả các yêu cầu tiếp theo sử dụng ngữ cảnh tĩnh sẽ thất bại.

Đề nghị bạn tìm thấy một cách để có một cuộc đời ngắn hơn nhiều cho bối cảnh thực thể của bạn - mở nó, làm một số công việc, vứt bỏ nó, ...

Theo như đưa đối tượng khác nhau của bạn trong cùng một EDMX, đó gần như chắc chắn là câu trả lời đúng nếu họ có bất kỳ mối quan hệ nào giữa các đối tượng bạn sẽ muốn chúng trong cùng một EDMX.

Để tải lại - người dùng không bao giờ phải thực hiện việc này. Đằng sau hậu trường, bạn có thể mở một bối cảnh mới, tải lại phiên bản hiện tại của đối tượng từ cơ sở dữ liệu, áp dụng các thay đổi mà họ đã thực hiện trong giao diện người dùng và sau đó lưu lại.

Bạn cũng có thể muốn xem xét các thực thể tách rời và xem xét các ngoại lệ đồng thời lạc quan khi bạn cố gắng lưu thay đổi và người khác đã thay đổi cùng một đối tượng trong cơ sở dữ liệu.

+0

OK vì vậy nếu tôi đang sử dụng nhiều ngữ cảnh, một ngữ cảnh sẽ biết làm mới dữ liệu như thế nào. Tôi có nó theo dõi một sự kiện bất động sản được thiết lập bởi bối cảnh khác không? – CodeWarrior

+0

Ngữ cảnh phải được đóng và biến mất khi ứng dụng ở trạng thái không hoạt động. Tất cả những gì bạn có là DTO hoặc các thực thể bị hủy trong trạng thái này. Khi ai đó nhấp vào nội dung nào đó bạn mở một ngữ cảnh, gắn lại các thực thể của bạn hoặc tải lại chúng và áp dụng các thay đổi từ giao diện người dùng và sau đó gọi savechang xử lý bất kỳ trường hợp ngoại lệ lạc quan nào có thể ném, sau đó cập nhật chế độ xem và cuối cùng loại bỏ ngữ cảnh. Hãy nghĩ về bối cảnh như giới hạn một đơn vị công việc. –

+0

Điều đó thể hiện sự thay đổi cơ bản trong cách tôi xem chức năng EF. Tôi đã được ấn tượng rằng bối cảnh được dự kiến ​​sẽ giữ tài liệu tham khảo để các đối tượng nó tạo ra từ dữ liệu cho đến khi viewmodel disposes của nó (khi xem được xử lý). Hiện tại tôi có ViewModels của tôi đang tải đối tượng Lô hàng qua EF, được tải vào bộ sưu tập tùy chỉnh và được hiển thị trong Chế độ xem. Sau khi thay đổi được thực hiện cho các đối tượng bộ nhớ, tôi gọi lưu thay đổi và bối cảnh tương tự (phải không?) Làm cho các bản cập nhật cho máy chủ. Nếu điều đó không đúng, khi tôi lưu các thay đổi, nó có hoạt động khác không? – CodeWarrior

3

Câu hỏi hay, Cory. Thumb up từ tôi.

Khuôn khổ thực thể cung cấp cho bạn lựa chọn miễn phí - bạn có thể thiết lập nhiều bối cảnh hoặc chỉ có một ngữ cảnh tĩnh. Nó sẽ hoạt động tốt trong cả hai trường hợp và có, cả hai giải pháp đều an toàn. Lời khuyên có giá trị duy nhất tôi có thể cung cấp cho bạn là: thử nghiệm với cả hai, đo lường hiệu suất, sự chậm trễ, vv và chọn tốt nhất cho bạn.Nếu điều này thực sự là một ứng dụng khổng lồ với hàng tấn kết nối đồng thời, tôi sẽ khuyên bạn nên sử dụng một bối cảnh tĩnh hoặc một ngữ cảnh tĩnh, tĩnh và chỉ vài cái bổ sung để hỗ trợ . Nhưng, như tôi đã viết chỉ vài dòng ở trên - nó tùy thuộc vào yêu cầu của bạn, giải pháp nào tốt hơn cho bạn.

Tôi đặc biệt thích phần này của câu hỏi của bạn:

Tôi chỉ không muốn một trong những ứng dụng mà người dùng phải nhấn tải lại cả chục lần trong khác nhau phần của ứng dụng để có được dữ liệu mới.

WPF là một công cụ thực sự mạnh mẽ và cơ bản là khi người dùng phải nhấn nút để làm mới dữ liệu sẽ biến mất vĩnh viễn. WPF cung cấp cho bạn một loạt các công cụ đa luồng, không đồng bộ, chẳng hạn như lớp Dispatcher hoặc Background worker để làm mới nhẹ nhàng dữ liệu mong muốn trong nền. Điều này thực sự tuyệt vời, bởi vì không chỉ bạn không phải lo lắng về việc nhấn các nút khác nhau, mà còn chủ đề nền không chặn giao diện người dùng, vì vậy dữ liệu được làm mới một cách minh bạch từ quan điểm của người dùng.

WPF cùng với Khung thực thể thực sự đáng để học hỏi - xin vui lòng hỏi xem bạn có bất kỳ mối lo ngại nào khác không.

+0

Piotr, vui lòng xem cuộc trò chuyện với Hightechrider. Tôi về cơ bản tự dạy mình WPF và EF khi tôi đi cùng. Ứng dụng đầu tiên của tôi khá xấu xí và kludgy, nhưng chúng trở nên tinh tế hơn khi tôi đi. Bất kỳ tài nguyên tốt nào bạn có để quản lý chức năng ViewModel đều tuyệt vời. Tôi thấy rất nhiều kết quả khi tìm kiếm, nhưng hầu hết là những lời giải thích khá chung chung về MVVM và tương tự. – CodeWarrior

+0

Xin chào, imo bài viết MVVM tốt nhất dành cho người mới bắt đầu là bài viết này: http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx Việc này đơn giản nhất có thể cung cấp cho bạn nhiều thông tin nhất mà bạn cần để bắt đầu một mình . Vui lòng báo cáo tiến độ của bạn :) –

+0

Bài viết đó không phải về Khung thực thể. Đó là về MVVM và kiểm soát TreeView. – CodeWarrior

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