实体框架对象上下文刷新

本文关键字:刷新 上下文 对象 框架 实体 | 更新日期: 2023-09-27 17:56:13

我有一个返回单个对象的 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());
}

实体框架对象上下文刷新

根据这篇文章,这可能会有所帮助:

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