Entity framework EF6执行长时间运行的存储过程会收到超时错误
我最近将我的项目从EF5升级到EF6。在这个项目中,我有一个定期运行的Azure Worker角色,在SQLAzure上启动一个存储过程,更新一组数据库信息,平均执行时间为1.5小时。完成后,辅助角色将使用存储过程的返回结果执行其他任务 这在EF5中曾经完美地工作,但在EF6中,它每次都会失败,出现以下错误之一: 错误从服务器接收结果时发生传输级别错误。(提供程序:会话提供程序,错误:19-物理连接不可用) 错误会话已终止,因为它获取了太多锁。尝试在单个事务中读取或修改较少的行。当前命令发生严重错误。如果有结果,则应放弃 我尝试了以下方法来修复错误: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-物理连接不可用) 错误会话已终止,因为它获取了太多锁。尝试在单个事务中读取或修改较少的行。当前命令发生严重
SqlAzureExecutionStrategy
,并将其恢复为使用DefaultExecutionStrategy
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传递一个新的枚举参数,该参数将禁用 交易