2011-10-22 63 views

回答

13

您很可能会看到一个DbContext,它没有Refresh方法。您可以使用IObjectContextAdapter界面来获取底层ObjectContext,并在其上调用Refresh。

var objectContext = ((IObjectContextAdapter)context).ObjectContext; 
+0

荣誉“漂流”,你为我保存了一天。在这个问题上有* LOTS *的答案,你的是迄今为止最好的!它真的太糟糕了,DbContext不直接支持刷新?这似乎是在多层应用程序中需要的一种非常常见的模式。我接近刚刚读取对象,然后复制在看到您的答案之前更改的内容:-) – Joe

2

您也可以使用刷新功能的代理对象...这里是重装所有修改的对象的示例:

  var modifiedEntries = context.ChangeTracker.Entries() 
       .Where(e => e.State == EntityState.Modified); 
      foreach (var modifiedEntry in modifiedEntries) { 
       modifiedEntry.Reload(); 
      } 
0

在这个线程发布可能帮助过答案:Refresh entity instance with DbContext

综上所述,虽然,你可能会尝试调用类似以下内容:

dbContext.Entry(someEntityObjectInstance).Reload(); 

但是,别人注意到这不会刷新导航属性,所以如果您不得不担心刷新导航属性,您也需要重新加载()所有导航属性,或者您需要分离()或Refresh()后投射到IObjectContextAdapter,或者可能只是重新创建您的DbContext。

就我而言,我坦率地决定这是最好的只是重建的背景下,重新找到()实体:

dbContext = new Model.Entities(); 
someEntityObjectInstance = dbContext.SomeEntityType.Find(someEntityObjectInstanceKey); 

目前可以说是没有简单/最好的答案在这里。