2016-08-12 31 views
5

Tôi đã có một ứng dụng trong đó bao gồm 2 phần tại thời điểmLàm thế nào để ... hiển thị dữ liệu từ cơ sở dữ liệu

  1. Một Viewer tiếp nhận dữ liệu từ một cơ sở dữ liệu sử dụng EF
  2. Một dịch vụ mà thao tác dữ liệu từ cơ sở dữ liệu khi chạy.

Logic đằng sau hậu trường bao gồm một số dự án như kho - truy cập dữ liệu được thực hiện với đơn vị công việc. Bản thân Viewer chính là một WPF-Form với ViewModel cơ bản.

ViewModel chứa ObservableCollection là nguồn dữ liệu của Trình xem của tôi.

Bây giờ câu hỏi đặt ra là - Làm cách nào tôi có thể truy xuất dữ liệu-cơ sở dữ liệu sau mỗi vài phút? Tôi biết hai vấn đề sau đây:

  1. Đây không phải là dữ liệu mới nhất mà Kho lưu trữ của tôi đang tải - công cụ "thông minh" và truy xuất dữ liệu từ bộ nhớ cache cục bộ? Nếu vậy, làm thế nào tôi có thể buộc EF tải dữ liệu từ cơ sở dữ liệu?
  2. Đặt lại toàn bộ ObservableCollection hoặc thêm/xóa đối tượng khỏi chủ đề/nền tảng khác (có tính năng phát hiện) là không thể. Làm thế nào tôi phải giải quyết điều này?

Tôi sẽ thêm một số mã của mình nếu cần nhưng tại thời điểm này tôi không nghĩ rằng điều này sẽ giúp ích chút nào.

Edit:

public IEnumerable<Request> GetAllUnResolvedRequests() { 
     return AccessContext.Requests.Where(o => !o.IsResolved); 
    } 

Đoạn mã này sẽ không nhận được dữ liệu mới nhất - tôi chỉnh sửa một số hàng bằng tay (bộ IsResolved true) nhưng phương pháp này lấy nó vẫn.

Edit2:

Properties after editing data manually in database

Data in the database

Edit3:

var requests = AccessContext.Requests.Where(o => o.Date >= fromDate && o.Date <= toDate).ToList(); 
     foreach (var request in requests) { 
      AccessContext.Entry(request).Reload(); 
     } 
     return requests; 

Câu hỏi cuối cùng: Mã ở trên "giải quyết" vấn đề - nhưng theo ý kiến ​​của tôi nó không sạch sẽ. Có cách nào khác không?

+0

EF sẽ tải dữ liệu từ cơ sở dữ liệu chứ không phải bộ nhớ cache. Có vẻ như bạn cần một số loại kiến ​​trúc không đồng bộ pub/sub. –

+0

Cảm ơn câu trả lời của bạn nhưng nếu điểm ngắt ngay sau khi trả về được nhấn tất cả Yêu cầu (bất kể nếu tôi thay đổi nó trong db theo cách thủ công (trước khi trở về)) chứa thuộc tính IsResolved with the value false => Sửa đổi dữ liệu trong thời gian chạy wont result trong dữ liệu cập nhật – C4p741nZ

Trả lời

1

Khi bạn truy cập thực thể trên cơ sở dữ liệu, thực thể được lưu trong bộ nhớ cache (và được theo dõi để theo dõi các thay đổi mà ứng dụng của bạn thực hiện cho đến khi bạn chỉ định AsNoTracking).
Điều này có một số vấn đề (ví dụ: các vấn đề hiệu suất do bộ nhớ cache tăng hoặc bạn thấy phiên bản cũ của các thực thể trong trường hợp của bạn).
Vì lý do này, khi sử dụng EF, bạn nên làm việc với Đơn vị công việc (ví dụ: bạn nên tạo một ngữ cảnh mới cho mỗi đơn vị công việc).

Bạn có thể xem qua bài viết này của Microsoft để hiểu cách triển khai Đơn vị công việc. http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

Trong trường hợp của bạn, sử dụng Tải lại không phải là lựa chọn tốt vì ứng dụng không thể mở rộng. Đối với mỗi lần tải lại bạn đang thực hiện một truy vấn tới cơ sở dữ liệu. Nếu bạn chỉ cần trả về các thực thể mong muốn, cách tốt nhất là tạo một ngữ cảnh mới.

public IEnumerable<Request> GetAllUnResolvedRequests() 
{ 
    return GetNewContext().Requests.Where(o => !o.IsResolved).ToList(); 
} 
+0

Nhưng việc tạo một bối cảnh mới mỗi khi Phương pháp được truy cập là - theo ý kiến ​​của tôi - không phải là một pracitce tốt ... Sẽ không tạo ra một đơn vị công việc mới là một giải pháp tốt hơn? – C4p741nZ

+0

Bạn nói đúng, bạn nên tạo một ngữ cảnh cho đơn vị công việc. Vấn đề tạo ngữ cảnh ở sai vị trí là bạn không thể thêm hoặc cập nhật các thực thể từ ngữ cảnh khác nhau/hỗn hợp. – bubi

0

Đây là những gì bạn có thể làm.

Bạn có thể xác định Tác vụ (tiếp tục chạy trên ThreadPool) định kỳ kiểm tra Cơ sở dữ liệu (xem xét định kỳ làm cho EF tải lại dữ liệu có chi phí riêng).

Và bạn có thể xác định SQL Dependency trên truy vấn của mình để khi có thay đổi về dữ liệu, bạn có thể thông báo cho chủ đề chính cho tương tự.

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