将实体从数据库重新加载到现有上下文

时间:2018-01-30 23:59:06

标签: c# wpf mvvm entity-framework-6

我有一个关于刷新实体背景的问题。

我有这个方法,我从msdn walkthrough开始。它有一个长期运行的背景。

protected async override void GetData()
{
    ThrobberVisible = Visibility.Visible;
    ObservableCollection<ProductVM> _products = new ObservableCollection<ProductVM>();
    var products = await (from p in db.Products
                           orderby p.ProductShortName
                           select p).ToListAsync();
    foreach (Product prod in products)
    {
        _products.Add(new ProductVM { IsNew = false, TheEntity = prod });
    }
    Products = _products;
    RaisePropertyChanged("Products");
    ThrobberVisible = Visibility.Collapsed;
}

它并没有像我想象的那样发挥作用。假设我运行应用程序,而不更改数据应用程序端,我打开SQL Server数据库并更改现有记录的值并添加新记录。

private void RefreshData()
{
    GetData();
}

当我运行RefreshData()时,我认为它会完全刷新数据,但只有新记录通过,应用程序端现有记录的值才会更新。

我已经看到确保上下文完全刷新的唯一方法是创建一个新的上下文实例。

但是,我想了解为什么/正在发生的事情。为什么价值没有更新?

1 个答案:

答案 0 :(得分:1)

实体框架中的DbContext自动缓存它从数据库中检索的数据。您可以通过调用每个实体的Reload()方法显式重新加载实体:

foreach (Product prod in products)
{
    db.Entry(prod).Reload();
    _products.Add(new ProductVM { IsNew = false, TheEntity = prod });
}

...或者你可以禁用跟踪:

var products = await (from p in db.Products
                       orderby p.ProductShortName
                       select p).AsNoTracking().ToListAsync();

此处提供了更多选项和信息:http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/