我有一個簡單的C#MVVM WPF應用程序,其中有一個MainWindow存放一個Ribbon和一個ContentControl。基於功能區操作,我切換到不同的用戶控件並在ContentControl中顯示。實體框架6避免重複加載
要加載視圖模型內部的數據我基本上做到這一點:
public class ProductsViewModel : BaseViewModel
{
public CollectionViewSource ProductsCollection { get; private set; }
private MyDataContext _ctx;
public ProductsViewModel()
{
ProductsCollection = new CollectionViewSource();
_ctx = new MyDataContext();
Load()
}
public void Load()
{
_ctx.Products.Load();
ProductsCollection.Source = _ctx.Products.Local;
}
}
現在Load
方法被調用每次我展示這個視圖模型作爲DataContext的用戶控件。
有什麼辦法可以避免這種情況?因爲_ctx.Products.Load()
需要一些嚴重的時間(對於11K記錄)並且訪問ObservableCollection時_ctx.Products.Local
也很慢。
我喜歡爲每個UserControl和.Local
集合使用DataContext,因爲它很容易讓UI與數據庫保持同步。但如果有更好的方法,請讓我知道。
我對EF和MVVM/WPF非常陌生,所以非常感謝每一個幫助!
P.S:我使用EF 6,數據庫首先使用SQL Server 2014
第一個問題是:爲什麼要加載所有記錄? –
因爲我有一個DataGrid,用戶可以在其中編輯記錄,並且至少沒有簡單的解決方案在WPF DataGrid中實現分頁afaik ... – CeOnSql
有幾種方法可以提高性能,但它取決於您的應用程序的邏輯。您可以在數據檢索中添加一些過濾器,或者可以將數據檢索放在更高級別上(例如,在頁面的根目錄而不是用戶控件上,使其成爲某種靜態/單態)。只是另一個細節:我不認爲你需要在DbContext Set實例上調用.Load()方法。另外:你能告訴我們你的實體框架配置(例如延遲加載) – hbulens