2016-04-28 69 views
0

我已經使用實體框架構建了一個WPF應用程序。我的數據存儲由分層數據組成(一個項目,具有多個不同的子實體)。C#實體框架:使用MVVM的單身上下文模式

到目前爲止,我一直在爲我的上下文使用單例模式,因爲這使我可以在我的UI中擁有一個全局導航樹(隨後用戶選擇展開特定的父項以顯示其子項時會延遲加載) 。這已經偉大的工作到現在爲止,但我現在遇到了可怕的例外:

A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe. 

我明白,我看到這個例外,由於一些單位和同時請求執行一些動作正在進行加載其他實體,全部來自同一個單例上下文。

我進一步明白,最好讓上下文保持儘可能短的時間。但是,如果我希望用戶能夠看到整個項目並一次對某些實體進行更改,這將如何實現?我完全喪失瞭如何使用短暫的上下文來配置這個全局導航樹(因爲我一直在'上下文已經處置'問題中運行)。

我是否應該在上下文周圍實現一些鎖定機制,或者更糟糕的是,在從上下文請求它之前,是否已使用此鎖定機制檢查每個屬性?這種情況下推薦的最佳做法是什麼?

回答

1

正確,DbContext實例很便宜(它們只是包含在池式數據庫連接中的包裝)。

如果你想保持持久化操作之間的實體,那麼你可以分離並重新附加實體到新DbContext實例:

https://msdn.microsoft.com/en-us/data/jj592676.aspx

FooEntity fromPreviousContext = ... 

using (DbContext context = new DbContext()) 
{ 
    context.Foos.Attach(fromPreviousContext); 
    context.SaveChanges(); 
} 

一個側面說明:一般Singleton模式被認爲是很多人認爲這是一種反模式,因爲很容易被誤用,特別是當使用單例實例來存儲上下文數據時 - 它變得只是一個稍微更全面的方法來處理全局變量。您可能需要考慮Context模式(與DbContext無關)。

相關問題