加载在另一个DbContext中进行的更改

时间:2012-09-03 10:56:32

标签: entity-framework ef-code-first entity-framework-5

我有一个WPF应用程序,其中包含一个网格,其中包含我使用EF加载的数据列表。某些其他窗口可以更改网格上加载的相同数据,但使用不同的dbcontext实例。如何查看网格上已更改的数据?我知道我可以使用ctx.Entry<MyEntity>(instance).Reload();刷新单个实体 - 但我希望看到所有更改,无论我做什么,我只看到旧值。在这种情况下,我无法使用AsNoTracking创建新的DbContext实例。

1 个答案:

答案 0 :(得分:13)

  

对我而言,看起来像一个非常简单的案例,我不明白为什么EF不仅仅是   更新实体的值。

EF也有这种机制,但它没有在DbContext API上公开。您需要返回ObjectContext。如果您只想重新加载一组实体,请致电:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload);

RefreshMode.StoreWins会导致所有挂起的更改被重新加载的值覆盖。您还可以使用RefreshMode.ClientWins来保存更改并将其与重新加载的数据合并。这种方法的问题是它只重新加载你已经拥有的实体。你不会得到新的实体。

如果你想获得新的实体,你必须执行一个查询,你必须告诉EF你想要重新加载值:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objectSet = objectContext.CreateObjectSet<MyEntity>();
objectSet.MergeOption = MergeOption.OverwriteChanges;
var result = objectSet.Where(...).ToList();

再次MergeOption.OverwriteChanges会覆盖所有待处理的更改,但您可以使用MergeOption.PreserveChanges将重新加载的值合并到已修改的值中。

我认为使用某些关系刷新值仍然存在一些问题,也可能是数据库中删除的实体。