這是在 EF 6 之前。我的公司有一個流程,可以與我們期望的所有其他客戶一起工作。該過程打開到客戶端數據庫的連接,一次讀取 1000 條記錄,并將其提交到我們的數據庫。對于這個客戶端,我們讀取并提交前 1000 條記錄就好了。當它再次開始讀取時,我得到“底層提供程序在打開時失敗”。我知道每次讀取都會打開和關閉 EF 事務,因此當它嘗試重新打開連接以進行下一次讀取時,它就會失敗。詳細信息:我們通過 VPN 連接到客戶端數據庫。代碼流程為: connection.open() create datareader while datareader.read() get 1000 records bulk commit db.SaveChanges get next 1000 records and so on until it gets all records在第一次 SaveChanges 之后是我們得到錯誤的時候。任何幫助表示贊賞。
2 回答

慕萊塢森
TA貢獻1810條經驗 獲得超4個贊
感謝大家的幫助。事實證明,丟失的連接是我們的數據庫而不是客戶端的。不完全確定原因,但似乎有幫助的是將我們的 BulkInsert 方法在 using 塊內創建 SqlBulkCopy 對象。我們還在失敗時重新建立了連接。這有點hacky,但它正在工作。

慕虎7371278
TA貢獻1802條經驗 獲得超4個贊
在 EF6 之前,無論 DbContext 是否擁有它,它都會在被釋放時關閉連接。從 EF6 開始,上下文遵循contextOwnsConnection
傳遞給構造函數的標志(參見此處)。從您的偽代碼中不清楚您如何實例化連接和上下文,因此假設您在循環中創建上下文并傳遞打開的連接。如果是這種情況,您有幾個選擇:
升級到 EF6,或
僅對所有保存使用一個 DbContext,或者
將所有記錄加載到內存中,并在其自己的 DbContext 中以塊的形式處理它們,或者
分塊加載,分塊處理
如果出于性能原因避免使用相同的上下文進行處理,則可以使用 .AsNoTracking()。MSDN 上有一篇關于 EF 性能調整的文章,以防您需要更多。
- 2 回答
- 0 關注
- 161 瀏覽
添加回答
舉報
0/150
提交
取消