亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

EF 第二筆交易獲取基礎提供者在打開時失敗

EF 第二筆交易獲取基礎提供者在打開時失敗

C#
SMILET 2022-01-09 10:07:21
這是在 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,但它正在工作。


查看完整回答
反對 回復 2022-01-09
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

在 EF6 之前,無論 DbContext 是否擁有它,它都會在被釋放時關閉連接。從 EF6 開始,上下文遵循contextOwnsConnection傳遞給構造函數的標志(參見此處)。從您的偽代碼中不清楚您如何實例化連接和上下文,因此假設您在循環中創建上下文并傳遞打開的連接。如果是這種情況,您有幾個選擇:

  • 升級到 EF6,或

  • 僅對所有保存使用一個 DbContext,或者

  • 將所有記錄加載到內存中,并在其自己的 DbContext 中以塊的形式處理它們,或者

  • 分塊加載,分塊處理

如果出于性能原因避免使用相同的上下文進行處理,則可以使用 .AsNoTracking()。MSDN 上有一篇關于 EF 性能調整的文章,以防您需要更多。


查看完整回答
反對 回復 2022-01-09
  • 2 回答
  • 0 關注
  • 161 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號