【发布时间】:2016-07-04 16:44:15
【问题描述】:
我有一个简单的 C# MVVM WPF 应用程序,其中有一个 MainWindow,其中包含一个 Ribbon 和一个 ContentControl。基于功能区操作,我切换到不同的用户控件并在 ContentControl 中显示。
要在 ViewModel 中加载数据,我基本上是这样做的:
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;
}
}
现在,每次我将此 ViewModel 作为 DataContext 显示 UserControl 时,都会调用 LoadMethod。
有什么办法可以避免这种情况吗?因为_ctx.Products.Load()需要一些很长的时间(对于 11K 记录)并且使用 _ctx.Products.Local 访问 ObservableCollection 也非常慢。
我喜欢为每个 UserControl 和 .LocalCollection 使用 DataContext,因为它很容易使 UI 与数据库保持同步。但如果有更好的方法,请告诉我。
我对 EF 和 MVVM/WPF 非常陌生,因此非常感谢您的帮助!
P.S.:我使用的是 EF 6,Database First 和 SQL Server 2014
【问题讨论】:
-
第一个问题是:为什么要加载所有记录?
-
因为我有一个 DataGrid,用户可以在其中编辑记录,并且至少没有简单的解决方案可以在 WPF DataGrid 中实现分页 afaik...
-
有几种方法可以提高性能,但这取决于您的应用程序的逻辑。您可以在数据检索中添加一些过滤器,或者您可以将数据检索放在更高级别(例如,在页面的根目录而不是用户控件上,使其成为某种静态/单例)。另一个细节:我认为没有必要在 DbContext Set 实例上调用 .Load() 方法。另外:您能否向我们展示您的实体框架配置(例如延迟加载)
-
需要调用.Load()方法!我根本没有更改任何 EF 配置,因为我使用数据库优先延迟加载应该默认启用!?
标签: c# wpf mvvm entity-framework-6