首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加载在另一个DbContext中所做的更改

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

Stack Overflow用户
提问于 2012-09-03 18:56:32
回答 1查看 3.4K关注 0票数 9

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-03 21:02:46

在我看来,

是一个非常简单的例子,我不明白为什么EF不直接更新实体的值。

EF也有这个机制,但它不会暴露在DbContext应用程序接口上。你得回ObjectContext去。如果您只想重新加载一组实体,您将调用:

代码语言:javascript
运行
复制
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload);

RefreshMode.StoreWins会导致所有挂起的更改被重新加载的值覆盖。您也可以使用RefreshMode.ClientWins,它将保留您的更改并将它们与重新加载的数据合并。这种方法的问题是,它只重新加载已有的实体。您将不会获得新的实体。

如果你也想要得到新的实体,你必须执行一个查询,并且你必须告诉EF你想要重新装入数值:

代码语言:javascript
运行
复制
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objectSet = objectContext.CreateObjectSet<MyEntity>();
objectSet.MergeOption = MergeOption.OverwriteChanges;
var result = objectSet.Where(...).ToList();

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

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12246462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档