2013-11-28 92 views
60

我怎麼能刷新我的上下文?我有基於從我的數據庫視圖的實體,當我對一個具有導航屬性視圖的表進行更新時,實體更新,但視圖不刷新符合新的更新...只是想重新從Db的數據。 謝謝!實體框架刷新上下文?

回答

11

使用Refresh方法:

context.Refresh(RefreshMode.StoreWins, yourEntity); 

或替代處置您的當前環境,並創建一個新的。

+32

這在Entity Framework 6中不起作用 – JMK

+0

@JMK什麼東西在這裏不起作用?它似乎對我很好(EF 6.1.1)。 –

+0

@SebastianKrysmanski我將近一年前的評論,也許它已得到修復,因爲? – JMK

58

在您的上下文中刷新實體的最佳方式是處理您的上下文並創建一個新的上下文。

如果你真的需要刷新一些實體和你使用的是帶有的DbContext類代碼第一種方法,你可以使用

public static void ReloadEntity<TEntity>(
     this DbContext context, 
     TEntity entity) 
     where TEntity : class 
    { 
     context.Entry(entity).Reload(); 
    } 

要重新加載集合導航屬性,你可以使用

public static void ReloadNavigationProperty<TEntity, TElement>(
     this DbContext context, 
     TEntity entity, 
     Expression<Func<TEntity, ICollection<TElement>>> navigationProperty) 
     where TEntity : class 
     where TElement : class 
    { 
     context.Entry(entity).Collection<TElement>(navigationProperty).Query(); 
    } 

參考: https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload(v=vs.113).aspx#M:System.Data.Entity.Infrastructure.DbEntityEntry.Reload

+2

你能提供ReloadNavigationProperty THX – David

+0

的樣本用法我不能得到這個工作重裝孩子導航性能。 – Paul

45
yourContext.Entry(yourEntity).Reload(); 
+2

感謝您的簡單解決方案。我沒有看到用RX_DID_RX這樣的擴展方法封裝它的必要性 – Thomas

+0

這對我來說是一個救命稻草。謝謝! – Kevin

+7

請注意,這不加載集合導航屬性,只有實體條目本身。 –

-5

我已經讓自己的頭受傷了!答案很簡單 - 我只是回到基礎...

some_Entities e2 = new some_Entities(); //your entity. 

加入這一行,你更新後低於/刪除 - 您正在重新載入你的實體,沒有花哨的系統方法。

e2 = new some_Entities(); //reset. 
+15

您是否在正確的問題? –

19

如果要重新加載特定的實體,與DbContextApi,RX_DID_RX已經給了你答案。

如果要重新加載/刷新所有您所加載的實體:

如果您正在使用實體框架4.1+(EF5,或EF 6可能),API的DbContext:

public void RefreshAll() 
{ 
    foreach (var entity in ctx.ChangeTracker.Entries()) 
    { 
      entity.Reload(); 
    } 
} 

如果您正在使用的EntityFramework 4(ObjectContext的API):

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

最好的建議就是無論如何,嘗試使用「短命語境」,你會避免這種問題。

我寫了幾篇文章對此事:不建議

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

-2

與刷新刷新分貝範圍內,由於性能損失的方式。在執行每個操作之前初始化dbcontext的新實例已經足夠好了。它還爲您提供每次操作刷新的最新上下文。

using (YourContext ctx = new YourContext()) 
{ 
    //Your operations 
} 
+6

多德..傾倒你的情況下,每次也將刷新你不想做被刷新的東西,這真的會導致性能問題。 – LuckyLikey

+2

這是一個可怕的想法,因爲它影響到編寫單元測試的能力。如果你的代碼消失並且產生新的上下文,那麼在單元測試期間如何工作? – victor

+0

如果你展示一些樣品而不是批評,這對我和其他人會有用。 – aog

4

context.Reload()在MVC 4,EF 5中不適用於我,所以我做了這個。

context.Entry(entity).State = EntityState.Detached; 
entity = context.Find(entity.ID); 

及其工作正常。