Entity framework EF6执行长时间运行的存储过程会收到超时错误

Entity framework EF6执行长时间运行的存储过程会收到超时错误,entity-framework,azure-sql-database,entity-framework-6,Entity Framework,Azure Sql Database,Entity Framework 6,我最近将我的项目从EF5升级到EF6。在这个项目中,我有一个定期运行的Azure Worker角色,在SQLAzure上启动一个存储过程,更新一组数据库信息,平均执行时间为1.5小时。完成后,辅助角色将使用存储过程的返回结果执行其他任务 这在EF5中曾经完美地工作,但在EF6中,它每次都会失败,出现以下错误之一: 错误从服务器接收结果时发生传输级别错误。(提供程序:会话提供程序,错误:19-物理连接不可用) 错误会话已终止,因为它获取了太多锁。尝试在单个事务中读取或修改较少的行。当前命令发生严重

我最近将我的项目从EF5升级到EF6。在这个项目中,我有一个定期运行的Azure Worker角色,在SQLAzure上启动一个存储过程,更新一组数据库信息,平均执行时间为1.5小时。完成后,辅助角色将使用存储过程的返回结果执行其他任务

这在EF5中曾经完美地工作,但在EF6中,它每次都会失败,出现以下错误之一:

错误从服务器接收结果时发生传输级别错误。(提供程序:会话提供程序,错误:19-物理连接不可用)

错误会话已终止,因为它获取了太多锁。尝试在单个事务中读取或修改较少的行。当前命令发生严重错误。如果有结果,则应放弃

我尝试了以下方法来修复错误:

  • 已验证所有存储过程读取都具有带(NOLOCK)修饰符的
  • 将实体框架上下文的超时时间增加到5小时
  • 删除了已就位的新的
    SqlAzureExecutionStrategy
    ,并将其恢复为使用
    DefaultExecutionStrategy
  • 已删除存储过程中发生的所有事务
  • 确保worker角色中的此步骤在其自己的上下文中运行
  • 代码示例:

    using (var dbContext = new EFEntityContext())
    {
        // set the timeout to 5 hours
        var objectContext = (dbContext as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = 18000; // 5 hours
    
        // update all active curriculums
        var result = dbContext.usp_MyLongRunningProd();
    
        // log the results of the operation
        Trace.TraceInformation(result);
    }
    

    此外,存储过程将一个大表读入游标,在其中循环,并根据每个项执行分析和数据更改。我不需要游标在任何类型的事务中,也不使用我知道的游标,除非EF正在创建游标,这就是问题所在。

    我相信这篇文章可能有答案,但直到今晚我的作业运行,我才知道答案。如果成功,我将更新此答案:

    上面说:

    作为连接弹性工作的一部分,我们更改了默认值 某些API的行为可能会产生副作用,以便开始使用 交易。我们还介绍了一种选择退出这一新项目的方法 不支持事务的特定情况的行为 支持。例如,您可以在 Database.ExecuteSqlCommand传递一个新的枚举参数,该参数将禁用 交易