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/… 有时您甚至想更新未更改的项目,因为您想根据其他客户端在数据库中所做的更改来刷新它们。 @ShimmyGetObjectStateEntries()
需要一个参数(例如已修改),当我传入一个参数时,我得到一个异常,即实体与上下文断开连接。有什么想法吗?【参考方案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