2014-08-28 50 views
6

我有一個非常簡單的WinForms /實體框架(V6)程序:實體框架 - 離開DB語境下打開VS不斷地重新創建

  1. 查詢數據庫來填充表單元素
  2. 一旦用戶點擊,再查詢數據庫來獲得相關信息,這些信息
  3. 進行計算,並顯示給用戶

作爲一個新手,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的可能性,但這是一個不做任何更新的小型項目 - 只是查詢......這是一個合理的解決方案,或者這是一種危險的做事方式嗎?

+1

一般而言,您應該以某種工作單位的方式使用DBContext,否則數據可能會隨着數據庫上下文緩存實體而變得過時。如果您執行相同的查詢兩次,它只會觸及DB一次。我廣泛使用了EF,從來沒有發現以這種方式使用上下文是昂貴的。我會做更多的調查,看看你的放緩。 – 2014-08-28 13:55:44

+1

我也很好奇,如果重新創建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

+1

如果您不需要更改加載的數據(並將其寫回數據庫),則應考慮關閉對上下文的更改跟蹤(ctx.Configuration.AutoDetectChanges = false)。這應該會給你一個明顯的性能提升。 – 2014-08-28 14:05:28

回答

5

數據庫連接通常會集中在一個連接池中,幾乎包含任何現代查詢工具。這看起來很像線程池;一些連接將被打開,每創建一個新的上下文並請求一個連接,它將被獨佔使用一個現有的連接。在處理上下文時,連接將不會關閉,只會返回到連接池。

因此,不需要嘗試手動保持上下文長時間存活。將它們用於單個操作。

當然,如果您明確不希望發生連接池,可以禁用連接池,但很少有這樣做的原因。

+0

謝謝,Servy !!!! - 所以,要明白,你說的是,我的第一次郵寄根本不像我想象的那樣費用昂貴,因爲這種聯繫始終保持開放,直到應用程序結束時才保留在池中,我是否理解那是正確的? – 2014-08-28 14:06:09