加载在另一个DbContext中所做的更改



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

对我来说,这是一个非常简单的案例,我不明白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将重新加载的值合并到编辑的值中。

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

相关内容

最新更新