如何让Entity Framework 5更新陈旧数据

时间:2013-04-30 20:50:21

标签: c# entity-framework concurrency

我有一个没有问题的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;
}

原来这不会更新数据。所以我想也许我必须更改Merge选项,所以我添加了

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

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

更新

好的 - 事实证明这是一个测试方法问题。在看到@ jure的回复并实现它,并且出现不能正常工作后,我终于变聪明了。我爆发了SQL Profiler。正确的事情发生在幕后,但我没有做正确的事情来更新视图。一旦我这样做,我的原始代码工作。

2 个答案:

答案 0 :(得分:8)

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

dbContext.Entry(entity).Reload();

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

答案 1 :(得分:1)

处理和重新创建上下文是可行的方法。