9

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

4

1 回答 1

14

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

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

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

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

如果您还想获取新实体,则必须执行查询,并且必须告诉 EF 您要重新加载值:

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

再次MergeOption.OverwriteChanges覆盖所有挂起的更改,但您可以使用MergeOption.PreserveChanges将重新加载的值合并到您编辑的值。

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

于 2012-09-03T13:02:46.007 回答