我有一个WPF应用程序,该应用程序具有一个网格,其中包含我用EF加载的数据列表。某些其他窗口可以更改在网格上加载的相同数据,但使用不同的dbcontext实例。我如何在网格上查看更改的数据?我知道我可以使用ctx.Entry<MyEntity>(instance).Reload();
刷新单个实体-但我想查看所有更改,无论我做什么,我只会看到旧值。在这种情况下,我无法使用AsNoTracking
或创建新的DbContext
实例。
最佳答案
To me looks like a very simple case and I cannot see why EF don't just update the values of the entities.
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
将重新加载的值合并到已编辑的值中。我认为在刷新具有某些关系的值时可能还会存在一些问题,也许还有在数据库中删除的实体。
关于entity-framework - 加载在另一个DbContext中所做的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12246462/