2011-10-22 33 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); 

目前可以說是沒有簡單/最好的答案在這裏。