2

我一直在實體框架調用有一些奇怪的錯誤,我正在探索使用相同的ObjectContext併發多線程訪問的可能性。創建一個ThreadLocal EF上下文

我試圖通過在ThreadLocal中創建上下文來爲每個線程創建一個新的上下文。

private System.Threading.ThreadLocal<EF.XYZEntities> threadLocalContext = new System.Threading.ThreadLocal<EF.XYZEntities>(() => new EF.XYZEntities(connectionString)); 
private EF.XYZEntities context { get { return threadLocalContext.Value; } } 

這是行不通的。該上下文的第一次使用會引發一個錯誤:

Invalid object name 'dbo.Site'.

我該如何獲得此工作?

+2

我只是在線程內部創建上下文,並將其封裝在'using'塊中,因此它的作用範圍很大。創建上下文不是一個昂貴的操作... –

+0

也許有關? http://stackoverflow.com/questions/9415955/c-sharp-working-with-entity-framework-in-a-multi-threaded-server – rene

回答

1

使用共享上下文通常被認爲是「糟糕的」,除非你微處理得很好。使用管理不當的共享上下文可能會產生非常奇怪的結果。

這是通常的最佳實踐採取下列工作方法的單位與上下文:

using (DBEntities ctx = new DBEntities()) 
{ 
    // Explicitly open the context connection yourself - to help prevent connection pooling/sharing 
    // The connection will automatically be closed once exiting the using statement, 
    // but it won't hurt to put a ctx.Connection.Close(); after everything inside the using statement. 
    ctx.Connection.Open(); 

    // Do Stuff 

    // If necessary ctx.SaveChanges(); 
    // Not necessary but you could put a ctx.Connection.Close() here, for readability if nothing else. 
} 

UPDATE:大約在異步和EF答覆Noseratio的評論如下。 Taken from here

非目標

以下是我們明確不試圖將啓用在EF6特徵的東西:

  • 線程安全
  • 異步延遲加載

線程安全

雖然線程安全會使異步更有用,但它是一個正交的功能。由於EF與由用戶代碼組成的圖形進行交互以保持狀態,並且不容易確保此代碼也是線程安全的,所以我們不清楚是否可以在最常見的情況下實現對它的支持。

就目前而言,如果開發商試圖在同一時間執行兩個異步操作,並拋出,EF會檢測....

在EF

異步支持需要.NET 4.5,將不提供.NET 4

+0

這仍然可以是一個問題,如果'async/await'是在'using'裏面使用,[更多細節](http://stackoverflow.com/q/20993007/1768303)。 – Noseratio