ObjectContext.Refresh()?

Posted

技术标签:

【中文标题】ObjectContext.Refresh()?【英文标题】:ObjectContext.Refresh()? 【发布时间】:2010-12-17 08:16:47 【问题描述】:

如何更新数据存储中的所有脏实体,并将其更改的值重置为原始存储值?

ObjectContext.Refresh 方法需要将要刷新的实体作为参数。

【问题讨论】:

【参考方案1】:

以下通常有效:

Context.Refresh(RefreshMode.StoreWins, _
    Context.ObjectStateManager.GetObjectStateEntries())

它有时会导致 EntityRelations 出现问题。查看我的评论了解更多详情。

【讨论】:

这只是节省了我自己遍历对象图的许多代码行。 有bug,请看:***.com/questions/1757872/… 有时您甚至想更新未更改的项目,因为您想根据其他客户端在数据库中所做的更改来刷新它们。 @Shimmy GetObjectStateEntries() 需要一个参数(例如已修改),当我传入一个参数时,我得到一个异常,即实体与上下文断开连接。有什么想法吗?【参考方案2】:

您可以使用此代码:

public void RefreshAll()

     // Get all objects in statemanager with entityKey 
     // (context.Refresh will throw an exception otherwise) 
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
                                                 EntityState.Deleted 
                                               | EntityState.Modified 
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);

     context.Refresh(RefreshMode.StoreWins, refreshableObjects);

我写了一篇关于如何 RefreshAll() 并以其他方式刷新上下文的帖子:

http://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

【讨论】:

如果您添加了项目,这将引发异常。在修复之前添加这个:var addedEntries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).ToList(); addedEntries.ForEach(entry => entry.Delete()); @AncientSyntax 你说得对。实际上,如果您考虑尝试刷新刚刚添加的实体是没有意义的。我已经编辑了从代码中删除 EntityState.Added 的响应。在您提出的解决方案中,您实际上是在删除刚刚添加的实体,因此不会添加任何内容。 这是否与SQL版本有关,所以它在12.0但11.0的SQL服务器上运行时有效?【参考方案3】:

如果要重置所有更改,可以将 ObjectContext 设置为 null 并重新实例化它。

我相信这会达到你想要的。

善良,

【讨论】:

我猜你是用 ASP.NET 工作的,所以说起来容易,我用的是长生命周期的上下文实例。【参考方案4】:

我们使用这个:

return Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted
System.Data.EntityState.Modified).All(ose 
  => 
    if(ose.Entity != null)
      Context.Refresh(RefreshMode.StoreWins, ose.Entity);
      return true;
    );

其中“上下文”是要刷新的上下文。我们通过更改状态和实体进行过滤,以避免出现新的实体和关系。

【讨论】:

以上是关于ObjectContext.Refresh()?的主要内容,如果未能解决你的问题,请参考以下文章

滚动数组要来回赋初值呀。。orzzzzzzzzzzzzzzzzzzzzzzzzzz

排序总结C++

常见算法

算法 -- o, o(n), o(logn), o(nlogn)

o, o(n), o(logn), o(nlogn)

排序算法性能比较