簡體   English   中英

創建ThreadLocal EF上下文

[英]Creating a ThreadLocal EF context

我在使用Entity Framework調用時遇到了一些奇怪的錯誤,並且我正在探索它們是否可能是由於使用同一ObjectContext進行並發多線程訪問所致。

我試圖通過將創建上下文放在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; } }

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

無效的對象名稱“ dbo.Site”。

我該如何工作?

除非您很好地管理所有事情,否則通常認為使用共享上下文是“壞的”。 使用管理不善的共享上下文會產生非常奇怪的結果。

通常,最佳實踐是在上下文中采用“工作單元”方法:

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.
}

更新:回應下面Noseratio關於異步和EF的評論。 從這里取

非目標

以下是我們明確不嘗試使用EF6中的功能啟用的功能:

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

線程安全

盡管線程安全性將使異步更加有用,但這是一個正交功能。 鑒於EF與由用戶代碼組成的圖進行交互以維護狀態,並且沒有簡單的方法來確保該代碼也是線程安全的,因此我們尚無法在最一般的情況下實現對它的支持。

目前,EF將檢測開發人員是否試圖一次執行兩個異步操作並拋出...。

EF中的異步支持需要.NET 4.5,而在.NET 4上將不可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM