我有一个WPF应用程序,其中包含一个网格,其中包含我使用EF加载的数据列表。某些其他窗口可以更改网格上加载的相同数据,但使用不同的dbcontext实例。如何查看网格上已更改的数据?我知道我可以使用ctx.Entry<MyEntity>(instance).Reload();
刷新单个实体 - 但我希望看到所有更改,无论我做什么,我只看到旧值。在这种情况下,我无法使用AsNoTracking
创建新的DbContext
实例。
答案 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
将重新加载的值合并到已修改的值中。
我认为使用某些关系刷新值仍然存在一些问题,也可能是数据库中删除的实体。