[英]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.