簡體   English   中英

如何...顯示數據庫中的數據

[英]How to… Display Data from Database

我有一個應用程序,目前由兩部分組成

  1. 使用EF從數據庫接收數據的查看器
  2. 在運行時從數據庫操作數據的服務。

幕后的邏輯包括一些項目,如存儲庫 - 數據訪問是通過一個工作單元實現的。 Viewer本身是一個帶有底層ViewModel的WPF表單。

ViewModel包含一個ObservableCollection,它是我的Viewer的數據源。

現在的問題是 - 我怎么能每隔幾分鍾檢索一次數據庫數據? 我知道以下兩個問題:

  1. 這不是我的存儲庫“加載”的最新數據 - EF“智能”的東西,並從本地緩存中檢索數據? 如果是這樣,我如何強制EF從數據庫加載數據?
  2. 無法重新設置整個ObservableCollection或從另一個線程/后台工作者(使用invokation)添加/刪除實體。 我該怎么解決這個問題?

如果需要,我會添加一些代碼,但目前我認為這根本不會有所幫助。

編輯:

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

這段代碼將無法獲取最新數據 - 我手動編輯了一些行(將IsResolved設置為true),但此方法仍會檢索它。

EDIT2:

在數據庫中手動編輯數據后的屬性

數據庫中的數據

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;

最后的問題:上面的代碼“解決”了問題 - 但在我看來它並不干凈。 還有另外一種方法嗎?

當您訪問數據庫上的實體時,將緩存該實體(並跟蹤該實體以跟蹤應用程序執行的更改,直到您指定AsNoTracking)。
這有一些問題(例如,性能問題,因為緩存增加或您看到舊版本的實體是您的情況)。
出於這個原因,當使用EF時,您應該使用工作單元模式(即您應該為每個工作單元創建一個新的上下文)。

您可以查看這篇Microsoft文章,了解如何實現工作單元模式。 http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-在安-ASP凈MVC應用程序

在您的情況下,使用Reload不是一個好選擇,因為應用程序不可擴展。 對於每次重新加載,您都在對數據庫進行查詢。 如果您只需要返回所需的實體,最好的方法是創建一個新的上下文。

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

這是你可以做的。

您可以定義定期檢查數據庫的任務(在ThreadPool上繼續運行)(考慮定期使EF重新加載數據有其自己的成本)。

並且您可以在查詢中定義SQL依賴關系 ,以便在數據發生更改時,您可以通知主線程也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM