2012-06-12 99 views
2

我被警告不要在我的應用程序中使用實體框架的多個DBEntityContext。原因是由於併發訪問數據庫而導致死鎖的風險。實體框架和DBContext問題

有人可以證實這一點嗎?如果這是真的,爲DBContext實現Singleton對象是一個好主意?

在這個問題上的任何文章是受歡迎的。

謝謝提前。

+0

你在說什麼類型的應用程序? –

+0

Web應用程序 – CloudyMarble

回答

8

ObjectContext和DbContext不是線程安全的。見http://msdn.microsoft.com/library/system.data.objects.objectcontext.aspx。如果您在像ASP.NET這樣的多線程環境中使用它們,則在使用單個實例時會遇到很大麻煩。建議每個請求使用一個ObjectContext。 ObjectContext必須在請求結束時處理。文章Managing Entity Framework ObjectContext lifespan and scope in n-layered ASP.NET applications可能會有幫助。

是否有可能,你錯過了你的顧問誰告訴你有關死鎖?也許他想警告你以錯誤的方式使用ObjectContext時可能出現的死鎖。

3

在Web應用程序中,您必須爲每個處理過的Web請求使用一個新的上下文實例,並在不再需要該實例之後處置該實例。上下文和與EF相關的任何東西都不是線程安全的。此外,它實現工作單元和身份映射模式,使other restrictions使用上下文實例。

死鎖可能會發生,但這是您必須通過正確的事務設計來解決的問題。

+0

謝謝你的答案,良好的鏈接,但不創建一個新的上下文每個請求海岸更多性能比作爲一個單身的應用程序生命週期的對象對嗎? – CloudyMarble

+0

明白了,我只是讀完了你的其他答案直到結束,它使得感覺,儘管如果表現可能是一個問題。 – CloudyMarble

+0

因此,我可以在ASP.NET MVC中爲每個控制器創建一個上下文,並將其置於控制器處置位置? – Shimmy