1

我正在使用MVC +實體框架5,目前正在查看Unit of Work pattern。在控制器類我看到下面的代碼:實體框架工作單元模式對象生命週期

private UnitOfWork unitOfWork = new UnitOfWork(); 

這是否意味着,對於每一個控制器UnitOfWork類被創建,導致每UnitOfWork實例的數據庫連接?或者做所有DbContext實例(本文中SchoolContext實例在UnitOfWork中創建)共享相同的連接?

我的第二個問題:當只有一個UnitOfWork實例被創建存儲在HttpContext中,還是有更好的方法時,它是否會提高應用程序的性能?

回答

1

首先,讓我告誡你。我知道你沒有這樣做,但我想確保你明白,你永遠不應該創建一個單一的數據上下文,並使其成爲一個靜態或單身。原因是靜態是應用程序的所有實例(即多個用戶)共享的,數據上下文不是多線程或多用戶安全的。

發出警告後,讓我們繼續前進。

一般來說,您不必擔心這一點。原因是,即使您創建了多個UnitOfWorks,每次只有一個控制器處於活動狀態(每個Web請求)。實體框架有一個連接池,可重用連接並優化其使用。 (實際上,這是Ado.net的一部分,但它仍然適用)

+1

謝謝!我在博客上閱讀了「HttpContex」存儲方法,是否類似於單例模式,這也意味着它是錯誤的? – Marthijn

+1

@Marthijn - 不,沒有什麼「錯誤」,但我通常不需要它,除非在某些罕見的情況下。 HttpContexts也僅適用於單個請求,因此如果向請求添加上下文,請求結束後它將被銷燬(儘管您應該在Application_EndRequest事件中手動處理它)。我沒有看到使用這種技術的任何收益。 –

+0

將您的工作單元存儲在請求中是我已經完成了幾年的工作,並且在網站上執行了相當大的流量(每天的百萬+ pgs)方面取得了成功。我最初擔心的是連接限制,但作爲「Myster Man」,EF和ADO做了一些黑巫術來保持游泳池的連續性。 – Doug