这是在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之后是我们得到错误的时间。 任何帮助表示赞赏。
答案 0 :(得分:0)
在EF6之前,DbContext在处置连接时将关闭该连接,无论它是否拥有它。从EF6开始,上下文遵循传递给构造函数的contextOwnsConnection
标志(请参阅here)。从伪代码中尚不清楚如何实例化连接和上下文,因此假定您在循环中创建上下文并传递打开的连接。如果是这样,您可以选择以下几种方法:
如果出于性能原因避免在处理中使用相同的上下文,则可以使用.AsNoTracking()。 MSDN上有an article关于EF性能调整的信息,以备您需要。
答案 1 :(得分:0)
感谢大家的帮助。原来,丢失的连接是到我们的数据库的,而不是到客户端的。不能完全确定为什么,但是似乎有帮助的是将我们的BulkInsert方法放在using块内创建SqlBulkCopy对象。在连接失败的时候,我们也重新建立了连接。有点小巧,但是可以用。