我有一個非常簡單的WinForms /實體框架(V6)程序:實體框架 - 離開DB語境下打開VS不斷地重新創建
- 查詢數據庫來填充表單元素
- 一旦用戶點擊,再查詢數據庫來獲得相關信息,這些信息
- 進行計算,並顯示給用戶
作爲一個新手,EF,我試圖遵循事物我的例子已經在網上找到,並已拿出東西的填充相當簡單/線沿線的查詢:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Using ctx As New MyEntities
<Query DB to populate initial values for first combobox>
End Using
End Sub
Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged
Using ctx As New MyEntities
<Queries to populate the other controls based upon user selections>
End Using
End Sub
Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click
Using ctx As New MyEntities
<Queries to get data, based upon user selections for calculations>
End Using
End Sub
什麼我發現是,似乎部分有所放緩我的程序(和請糾正我,如果我錯了,這個 - 正如我所說的,我是新手),它是我重新建立一個新的數據庫連接每次使用時間:
Using ctx As New MyEntities
...
End Using
在我的代碼。
所以,我想要做的是有一個窗體級別的變量ctx as MyEntities
- 建立窗體加載連接和關閉窗體關閉連接,並保持使用同一個...整個的線路:
Dim ctx as MyEntities
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ctx = New MyEntities
<Query ctx to populate initial values for first combobox>
End Sub
Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged
<Queries ctx to populate the other controls based upon user selections>
End Sub
Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click
<Queries ctx to get data, based upon user selections for calculations>
End Sub
Private Sub Main_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
ctx.Dispose()
ctx = Nothing
End Sub
當我交換的東西這樣的工作方式,它似乎有增加的速度大幅提升,我知道,這讓我開到可能做出錯誤的更改DB的可能性,但這是一個不做任何更新的小型項目 - 只是查詢......這是一個合理的解決方案,或者這是一種危險的做事方式嗎?
一般而言,您應該以某種工作單位的方式使用DBContext,否則數據可能會隨着數據庫上下文緩存實體而變得過時。如果您執行相同的查詢兩次,它只會觸及DB一次。我廣泛使用了EF,從來沒有發現以這種方式使用上下文是昂貴的。我會做更多的調查,看看你的放緩。 – 2014-08-28 13:55:44
我也很好奇,如果重新創建DBContext繼承類是昂貴的。在repo中的每個函數使用自己的DBContext實例之前,我已經建立了一個存儲庫。在那裏似乎沒有任何問題,但再次,該應用程序不是很密集的數據。請看這篇關於使用EF實現Unit of Work模式的文章:http://www.asp。net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4 /實現存儲庫和工作單元模式-asp-net-mvc-application – erdinger 2014-08-28 14:01:00
如果您不需要更改加載的數據(並將其寫回數據庫),則應考慮關閉對上下文的更改跟蹤(ctx.Configuration.AutoDetectChanges = false)。這應該會給你一個明顯的性能提升。 – 2014-08-28 14:05:28