Entity Framework 对象上下文刷新
Entity Framework Object Context Refresh
我有一个 LINQ 查询 returns 单个对象 - 上下文是 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);
但是有一个问题,我尝试刷新加载的对象,如果源查询中附加的任何项目被删除,它们在 refresh.I 上不会改变相信这是因为上下文只加载每个对象一次并保持缓存,但是我需要保持上下文打开,因为我需要保存回数据库。
我尝试使用以下方式刷新:
context.Refresh(RefreshMode.StoreWins, y);
或通过将实体状态设置为已修改来触发刷新:
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());
}
根据 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);
}
我有一个 LINQ 查询 returns 单个对象 - 上下文是 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);
但是有一个问题,我尝试刷新加载的对象,如果源查询中附加的任何项目被删除,它们在 refresh.I 上不会改变相信这是因为上下文只加载每个对象一次并保持缓存,但是我需要保持上下文打开,因为我需要保存回数据库。
我尝试使用以下方式刷新:
context.Refresh(RefreshMode.StoreWins, y);
或通过将实体状态设置为已修改来触发刷新:
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());
}
根据 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);
}