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

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

我有一个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/

相关文章:

c# - 使用 Entity Framework 获取存储过程输出参数引发映射错误 : The data reader is incompatible with the specified

entity-framework - AsNoTracking 复制实体

c# - 如何在 Entity Framework 和 EF Core 中使用 .Include()

sql - Entity Framework EF 代码首先使用 ExecuteStoreCommand 执行 sproc 很慢

c# - 如何递归地包含所有可导航属性以模拟延迟加载

c# - Entity Framework 5 代码优先配置封装

c# - 分层架构中的 Entity Framework

entity-framework - EF Core OnDelete 限制添加附加列

mysql - 生成的标识符对于约束名称来说太长

c# - EF Code First From DB 不为所有表创建实体