C# 实体框架对象上下文刷新

C# 实体框架对象上下文刷新,c#,entity-framework,linq,entity-framework-4,objectcontext,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.CreateSourceQue

我有一个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.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());
}
据报道,这可能有助于:

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

你试过这个吗<代码>上下文.Entry(y).Reload()objectcontext没有输入方法,您是对的。我会在几个小时后查看我的EF项目,你有没有看到alerady?我没有,我会在可能的情况下尝试:)这适用于我们的一些情况,特别是在这不起作用的情况下,将关系设置为null,这不会刷新它。我将标记为答案,但它仍然不完整。也许不要将关系设置为null。而是清除它们或删除元素。将
IEnumerable
设置为
null
从来都不是一个好主意,我们将尝试解决其他问题,谢谢,克里斯
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);
}