DbContext的良好用法

c# entity-framework entity-framework-core mvvm

我正在使用EntityFramework創建我的第一個應用程序。我正在使用Entity Framework Core和MVVMLight。

我創建了一個DbContext後代類。我想知道何時實現這個DbContext。

我的第一個想法是為每個View創建1個實例。

想像一下以下場景:

  • 我有一個Item類
  • 我創建了一個ItemsViewModel來管理項目列表。在這個viewModel中,我為DbContext添加了一個屬性
  • 當用戶雙擊某個項目時,它將顯示在與ItemViewModel關聯的詳細視圖中。此視圖模型還具有我的DbContext的實例。

當用戶退出詳細信息視圖時:

  • 如果他保存,我更新列表的DbContext
  • 如果他取消了,則不必更新列表

這是一種正確的做事方式嗎?我已經讀過某個地方應該只有一個DbContext實例。但在這種情況下,即使細節視圖被取消,對細節視圖的每個修改都會傳播到列表視圖。

很多人都喜歡聽

一般承認的答案

因此,您正在開發WPF應用程序,您可以為每個表單使用上下文實例。

來自EF團隊:

使用Windows Presentation Foundation(WPF)或Windows窗體時,請為每個窗體使用上下文實例。這使您可以使用上下文提供的更改跟踪功能。

我想建議使用帶有依賴注入(DI)的存儲庫模式。然後,您不必擔心實例化和處理dbcontext。那是自動的。

因此,您使用EF核心,您可以使用Autofac作為DI API。

適合您的好文章: 如何使用DbContext

另一篇好文章解釋瞭如何實現基於通用存儲庫模式與實體框架,IoC容器和依賴注入的解耦,可單元測試的N層架構。是的,本文適用於MVC。但是,您可以使用本文了解此模式。

通用存儲庫和工作單元模式,實體框架,Autofac


熱門答案

有很多文章和SO問題,google為“DbContext終身桌面應用程序”。此外,這篇MSDN雜誌可能會有所幫助,雖然他們討論了nHibernate的情況,但規則完全相同。

數據訪問 - 使用NHibernate構建桌面待辦事項應用程序

桌面應用程序的推薦做法是每個表單使用一個會話 ,以便應用程序中的每個表單都有自己的會話。每個表單通常代表用戶想要執行的獨特工作,因此將會話生命週期與表單生命週期相匹配在實踐中非常有效。額外的好處是您不再遇到內存洩漏問題,因為當您關閉應用程序中的表單時,您也會處置該會話。這將使會話加載的所有實體都有資格通過垃圾收集器(GC)進行回收。

每個表單更喜歡單個會話還有其他原因。您可以利用NHibernate的更改跟踪,因此在提交事務時它將刷新對數據庫的所有更改。它還在不同表單之間創建隔離屏障,因此您可以將更改提交到單個實體,而無需擔心對其他表單上顯示的其他實體的更改。

雖然這種管理會話生命週期的方式被描述為每個表單的會話,但實際上您通常會按照每個演示者管理會話。

至於“DbContext的1個實例”,這裡也有評論:

桌面應用程序常見的不良做法是為整個應用程序提供單個全局會話。

原因將在下面討論。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow