EF 第二个事务获取基础提供程序在打开时失败



这是在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

在第一次保存更改之后,我们会收到错误。 任何帮助,不胜感激。

在 EF6 之前,DbContext 在释放连接时关闭连接,无论它是否拥有它。 从 EF6 开始,上下文遵循传递给构造函数的contextOwnsConnection标志(请参阅此处(。从伪代码中不清楚如何实例化连接和上下文,因此假设您在循环中创建上下文并传递打开的连接。如果是这种情况,您有以下几种选择:

  • 升级到 EF6,或
  • 对所有保存仅使用一个 DbContext,或者
  • 将所有记录加载到内存中,并在自己的 DbContext 中以块的形式处理它们,或者
  • 将它们加载为块并按块处理

如果出于性能原因避免使用相同的上下文进行处理,则可以使用 。AsNoTracking((。MSDN 上有一篇关于 EF 性能优化的文章,以防您需要更多。

感谢大家的帮助。事实证明,丢失的连接是与我们的数据库而不是客户端的连接。不完全确定为什么,但似乎有帮助的是将我们的 BulkInsert 方法用于在 using 块中创建 SqlBulkCopy 对象。我们还在它失败的点上重新建立了连接。这有点笨拙,但它正在工作。

最新更新