use*_*627 9 entity-framework ef-code-first entity-framework-5
我有一个WPF应用程序,其中包含一个网格,其中包含我使用EF加载的数据列表.某些其他窗口可以更改网格上加载的相同数据,但使用不同的dbcontext实例.如何查看网格上已更改的数据?我知道我可以刷新一个实体ctx.Entry<MyEntity>(instance).Reload();- 但我希望看到所有的变化,无论我做什么,我只看到旧的价值观.在这种情况下,我既不能使用AsNoTracking也不能创建新DbContext实例.
Lad*_*nka 13
对我来说看起来像一个非常简单的情况,我不明白为什么EF不只是更新实体的值.
EF也有这种机制,但它没有在DbContext API上公开.您需要返回ObjectContext.如果您只想重新加载一组实体,您将调用:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload);
Run Code Online (Sandbox Code Playgroud)
RefreshMode.StoreWins导致所有挂起的更改被重新加载的值覆盖.您还可以使用RefreshMode.ClientWins哪个将保留您的更改并将其与重新加载的数据合并.这种方法的问题是它只重新加载你已经拥有的实体.你不会得到新的实体.
如果您还想获得新实体,则必须执行查询,并且必须告诉EF您要重新加载值:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objectSet = objectContext.CreateObjectSet<MyEntity>();
objectSet.MergeOption = MergeOption.OverwriteChanges;
var result = objectSet.Where(...).ToList();
Run Code Online (Sandbox Code Playgroud)
再次MergeOption.OverwriteChanges覆盖所有挂起的更改,但您可以使用MergeOption.PreserveChanges将重新加载的值合并到已编辑的值.
我认为使用某些关系刷新值仍然存在一些问题,也可能是在数据库中删除的实体.
| 归档时间: |
|
| 查看次数: |
3225 次 |
| 最近记录: |