更新實體框架模型時發生交易錯誤
在嘗試連接來自兩個單獨資料庫的實體時,開發人員可能會遇到錯誤:「New不允許事務,因為會話中還有其他執行緒正在運行。」當嘗試合併多個循環和實體框架上下文的程式碼時,可能會出現此令人困惑的訊息。
根本問題源自於實體框架 (EF) 為建立的每個上下文維護一個會話。當多個執行緒同時存取相同上下文時,可能會導致事務衝突。要解決此問題,避免在不同執行緒中修改相同的上下文至關重要。
在提供的範例中,錯誤的根本原因是在 EF 查詢上使用巢狀的 foreach 迴圈。這種方法意味著為外循環的每次迭代建立一個新的 EF 上下文,從而導致大量活動會話同時存取相同上下文。
最佳解決方案是使用查詢從 EF 檢索資料並將其儲存在中間集合中(例如,IList
以下是修改後的程式碼範例來說明:
IList<Client> clientList = from a in _dbFeed.Client.Include("Auto") select a; foreach (RivWorks.Model.NegotiationAutos.Client client in clientList) { var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a; // ... }
透過隔離從上下文中檢索數據,我們消除了重疊交易的風險並確保不會遇到錯誤。
以上是為什麼我的實體框架程式碼會拋出「不允許新事務,因為會話中還有其他執行緒正在運行」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!