EF第二笔交易获得底层证券提供者开仓失败

时间:2018-09-07 16:45:35

标签: c# entity-framework transactions

这是在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 个答案:

答案 0 :(得分:0)

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

  • 升级到EF6,或
  • 所有保存仅使用一个DbContext,或者
  • 将所有记录加载到内存中,并在其自己的DbContext中对每个记录进行分块处理,或者
  • 分块加载并分块处理

如果出于性能原因避免在处理中使用相同的上下文,则可以使用.AsNoTracking()。 MSDN上有an article关于EF性能调整的信息,以备您需要。

答案 1 :(得分:0)

感谢大家的帮助。原来,丢失的连接是到我们的数据库的,而不是到客户端的。不能完全确定为什么,但是似乎有帮助的是将我们的BulkInsert方法放在using块内创建SqlBulkCopy对象。在连接失败的时候,我们也重新建立了连接。有点小巧,但是可以用。