实体框架对象上下文刷新

Posted

技术标签:

【中文标题】实体框架对象上下文刷新【英文标题】:Entity Framework Object Context Refresh 【发布时间】:2016-11-11 04:23:15 【问题描述】:

我有一个返回单个对象的 LINQ 查询 - 上下文是 ObjectContext 而不是 DbContext

var q = from c in context.x //this has various includes but this just an example
where c.Id == xId
select c;

X x = q.FirstOrDefault();

然后我使用以下方法将一个集合附加到此

ObjectQuery<Z> y = x.Y.CreateSourceQuery().Include("1").Include("2");
x.Y.Attach(y);

但是有一个问题,我尝试刷新加载的对象,如果源查询中附加的任何项目被删除,刷新时它们不会改变。我相信这是因为上下文只加载每个对象一次并保持缓存,但是我需要保持上下文打开,因为我需要保存回数据库。

我尝试使用以下方法进行刷新:

context.Refresh(RefreshMode.StoreWins, y);

或通过将实体状态设置为已修改来触发刷新:

context.ObjectStateManager.ChangeObjectState(pb, EntityState.Modified);

我知道使用数据库上下文可以刷新实体以强制数据库刷新,我的问题是是否可以使用 ObjectContext 强制刷新。

使用 DbContext,我们可以通过刷新所有内容来获得所需的结果,但是您可以想象这非常慢。

var refreshableObjects = context.ChangeTracker.Entries().Select(e => e.Entity).ToList();
foreach (var obj in refreshableObjects)

    ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.GetRelationshipManager(obj).GetAllRelatedEnds().Where(r => r.IsLoaded).ToList().ForEach(c => c.Load());

【问题讨论】:

你试过了吗? context.Entry(y).Reload(); objectcontext 没有入口方法***.com/questions/11032683/… 是的,你是对的。几个小时后我可以访问我的 EF 项目 你看过this吗? 我没有,有空我会试试看的:) 【参考方案1】:

根据this post,这可能会有所帮助:

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);

【讨论】:

这适用于我们的某些情况,特别是在这不起作用的情况下,将关系设置为 null,这不会刷新它。我将标记为答案,但它仍然不完整。 也许不要将关系设置为空。而是清除它们或删除一个元素。将IEnumerable 设置为null 绝不是一个好主意 获得赏金,我们将尝试解决其他问题,谢谢,克里斯

以上是关于实体框架对象上下文刷新的主要内容,如果未能解决你的问题,请参考以下文章

如何刷新实体框架核心 DBContext?

是否需要处理实体框架上下文对象

如何使用实体框架关联来自多个上下文的对象

在实体框架中将对象树附加到对象上下文

如何使用对象上下文在实体框架中使用批量插入?

将对象添加到实体框架上下文大约需要 1.5 秒