2

我有一个可以正常工作的 EF5 WPF/MVVM 解决方案。该项目是一个订单输入系统,但加载订单会加载许多相关项目,因此上下文用于跟踪所有更改,然后将其保存,因此上下文是长期存在的。如果用户 A 加载了一个订单并且不对其进行任何操作,然后用户 B 加载了该订单并对其进行了更新,那么我有一个刷新按钮,旨在让用户 A 更新陈旧的数据。不幸的是,我似乎无法让 EF5 忽略缓存。我最初认为这会起作用:

   _trackingContext.GetObjectContext().Refresh(RefreshMode.StoreWins, theOrders);
   List<OrderLineItem> line_items = theOrders.SelectMany(x => x.OrderLineItems).ToList();
   _trackingContext.GetObjectContext().Refresh(RefreshMode.StoreWins, line_items);

GetObjectContext() 只是一个包装器

public ObjectContext GetObjectContext()
{
    return (this as IObjectContextAdapter).ObjectContext;
}

事实证明这不会更新数据。所以我想也许我必须更改合并选项所以我添加了

var set = _trackingContext.GetObjectContext().CreateObjectSet<OrderLineItem>();
set.MergeOption = MergeOption.OverwriteChanges;

我也尝试了 Orders (以及PreserveChanges选项),但没有任何效果。最终,我只是求助于处理和重新创建上下文,然后重新创建搜索选择,但似乎这应该是矫枉过正。是否有一些更简单的方法可以让 EF5 使用数据库中的新数据更新任何陈旧数据?

更新

好的 - 事实证明这是一个测试方法问题。在看到@jure 的回复并实施它之后,它似乎不起作用,我终于变得聪明了。我打破了 SQL Profiler。幕后发生了正确的事情,但我没有做正确的事情来更新视图。一旦我这样做了,我的原始代码就起作用了。

4

2 回答 2

9

DbEntityEntry 类中有一个Reload方法,所以你可以这样做:

dbContext.Entry(entity).Reload();

但这仅适用于需要从 Db 刷新的上下文中的一个对象。

于 2013-04-30T21:01:16.573 回答
0

处理和重新创建上下文是要走的路。

于 2013-04-30T20:53:52.187 回答