实体框架对象上下文刷新

时间:2016-07-08 14:39:54

标签: c# entity-framework linq entity-framework-4 objectcontext

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

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

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

据我所知,使用DB上下文可以刷新实体强制数据库刷新,我的问题是可以使用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());
}

1 个答案:

答案 0 :(得分:0)

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

BEGIN;
  SET LOCAL session_replication_role TO replica;
  UPDATE my_table SET x = (...);
COMMIT;