2011-04-27 128 views
10

我正在使用單個實例DbContext方案在WPF應用程序中本地隱藏數據庫的整個副本。我聽說這是不好的做法,但我的數據庫很小,在應用程序運行時我需要在本地完整拷貝它。實體框架4.1 DbSet重新加載

IQueryable擴展方法,Load()讓我預加載DbSet<>的元素,讓我可以綁定事情的DbSet<>的本地屬性。數據庫中的數據變化很快,所以我想SaveChanges()並重新加載的一切,甚至已經跟蹤的對象。再次調用Load()方法不會更新已被加載但被標記爲未更改的項目。

DbSet<>中重裝預裝物品的首選方法是什麼?關於我的頭頂,我只能想到調用SaveChanges(),然後遍歷所有條目並將跟蹤值和原始值都設置爲數據庫中的當前值,然後將Load()設置爲可能已添加的任何新對象。在我的場景中,不可能刪除對象,但我可能必須在長期運行中支持項目刪除。這看起來不正確,應該有辦法放棄一切並重新加載。看起來,放棄我的上下文並重新開始更容易,但WPF中的所有元素都已綁定到Local´ObservableCollection<>,這隻會弄亂界面。

回答

24

這不是你應該使用DbContext的方式,因爲這幾乎不可能重新加載數據。長期保持單一背景是incorrect usage。該鏈接還將回答爲什麼您的跟蹤實體未更新。

您可以選擇通過調用DbEntityEntryReload重裝一個單一的實體:

context.Entry(entity).Reload(); 

您也可以恢復到ObjectContext和使用ObjectQueryMergeOption.OverrideChanges,或使用Refresh爲實體與RefreshMode.StoreWins集合。

所有這些方法受到一些問題:

  • 如果記錄在數據庫中刪除,也不會被從上下文中刪除。
  • 關係的變化並不總是被刷新。

獲取最新數據的唯一正確方法是上下文創建一個新的數據並從頭開始載入所有內容 - 無論如何您都要這樣做。

+0

謝謝你的回覆,雖然我有些失落,因爲我已經讀到,在我的情況下,我的選擇恰恰相反。我會回顧這些話題,然後回來。 – Gleno 2011-04-27 19:42:52

+0

我的關係沒有變化,數據庫中也沒有刪除。我將在今天晚些時候開始另一個問題,並試圖解釋爲什麼我不能有一個短暫的DbContext。我真的希望你能夠接受一些有價值的投入。 – Gleno 2011-05-09 10:19:11

1

DbContexts應該短時間, 考慮保存更改後處理它並重新加載所有從一開始。 有兩組對象,一組來自數據庫,另一組來自綁定。

+5

我真的不能這樣做,因爲那樣的話,我會在進度失去UI狀態。我真的希望我能有一個短暫的DbContext,但我不明白在我的情況下可能如何。 – Gleno 2011-05-09 10:16:35

8

使用Entity Framework 4.1,WPF數據綁定建議已更改爲使用.Local和持久DbContext。

http://blogs.msdn.com/b/efdesign/archive/2010/09/08/data-binding-with-dbcontext.aspx

這當然可能,只要你需要,以處置它,但它可以,如果你做的UI產生負面影響。

這裏的另一種方法,但我不知道,它需要EF4.1的特點考慮在內:

http://msdn.microsoft.com/en-us/library/cc716735.aspx

+4

非常感謝,我對整個。地方的事情感到非常困惑。每個人和他們的狗都告訴我不要因爲任何原因使用單個DbContext,但它明確提供了這個.Local屬性來進行長期綁定。 – Gleno 2011-06-30 17:08:06

+1

@Gleno我完全同意你的觀點,恕我直言,大多數人都使用這種方式來處理上下文短暫的ASP,但對於桌面應用程序來說,重新加載你輸入新表單的所有內容都是無稽之談,特別是如果信息通過各種形式你的應用。 – Hannish 2013-09-27 12:37:22

0

請使用使用()用於CRUD.It將自動重新加載更新後的數據。

using (myDbContext context = new myDbContext()) 
{ 

} 

最好的問候, 忒提斯丁吳