EF Code First - 超时已过期。在完成之前,超时时间已过。

26

抱歉这个问题的措辞很奇怪。我不知道实际问题是什么,但希望有人能给我一些见解。

尝试运行迁移时,我遇到了以下错误:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
值得注意的是,在我的笔记本电脑上没有出现这种情况,但在我的虚拟机(Azure - Large)上出现了100%的失败率。 我正在使用Ef 6.0.0-rc1。请注意,更新EF不是一个选项。如果升级到EF 6.0.0或6.0.1,则会以100%的失败率收到以下错误: Errors during Code First add-migration。 我还计时了错误。触发该错误需要大约1.5分钟。当使用-Verbose标志运行时,它正在尝试创建200个具有索引的表。将SQL查询复制并在SSMS中执行需要5秒钟。 我尝试过几件事,但都没用: 1)根据此处所述将ObjectContext.CommandTimeout = 36000 // 10 hours!设置为: https://dev59.com/p2025IYBdhLWcg3wEhnr#6234593 2)在“web.config”中的连接字符串中设置超时: connectionString="Data Source=localhost;Initial Catalog=myDB;Integrated Security=SSPI;Connection Timeout=36000" 3)在“machine.config”交易maxTimeout中进行设置: <system.transactions> <machineSettings maxTimeout="00:00:00" /> </system.transactions> 4)在SQL Server上设置“远程查询超时”
USE MyDB;
GO
EXEC sp_configure 'remote query timeout', 0 ;
GO
RECONFIGURE ;
GO

那么发生了什么?为什么CommandTimeout没有被尊重?有任何建议吗?

完整跟踪如下:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out

   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TInterceptionContext,TResult](Func`1 operation, TInterceptionContext interceptionContext, Action`1 executing, Action`1 executed)
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
   at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
   at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass32.<ExecuteStatements>b__2e()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
   at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:8cbbc70c-8182-417e-9aca-4603f797340d
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

你能添加堆栈跟踪吗? - Den Pakizh
当然,@DenPakizh,我已将堆栈跟踪添加到问题中。 - Chi Chan
  1. 从堆栈跟踪看,迁移似乎没有使用 ObjectContext。
  2. 据我所知,此超时是建立连接的超时,而不是与执行实际语句相关的超时。 3,4) 我猜 EF Code 迁移在 SQLCommand 上设置了90秒的超时时间,这就是超时时间的控制因素。 您能否运行 SQL Server 分析器以查看最后执行的查询是什么?或者使用 http://technet.microsoft.com/en-us/library/ms175518.aspx 查找阻塞?
- Shane Neuville
8个回答

25
在迁移文件夹中的 Configuration.cs 类的构造函数中,添加属性 CommandTimeout = Int32.MaxValue;

@BastienVandamme 这是秒数。https://learn.microsoft.com/en-us/dotnet/api/system.data.objects.objectcontext.commandtimeout?view=netframework-4.7.2 - Stephan

7
我已经重启了SQL Server服务(Win7 - 计算机管理 > 服务和应用程序 > 服务)。

1
帮助我解决了一个无缘无故出现错误的简单查询问题,谢谢。 - FLCL
如果这可以帮助查询,请不要无缘无故地提出。原因是执行时间太长了。否则提出此问题也没有帮助,因为“简单”查询的默认时间已经足够了。也许该查询并不那么简单,可以启动分析器并查看执行时间。 - DanteTheSmith
1
@DanteTheSmith 这可能是由于事务未正确关闭而导致的锁定问题。 - FLCL

4
< p >提醒:EF迁移从单独的配置中获取超时时间:

public class MyContextConfiguration : DbMigrationsConfiguration<MyContext>
{
    public MyContextConfiguration()
    {
        CommandTimeout = 900;
    }
}

将900更改为更高的值,所有其他SQL超时更改(如web.config等)都没有起作用,这对我有用。


这是非常危险的,因为它会让每个查询或命令在最终抛出异常之前花费更多的时间。 - IRONicMAN
是的,我只在部署时更改它,然后改回正常状态。但对于大型数据库甚至小修改,这很有效。作为开发者尝试在框架内工作,这个过程非常奏效。 - ransems

2

对我来说,问题是迁移脚本运行时间太长(15分钟)。

以下是我解决问题的方法:
1. 运行 update-database -script 命令(可能需要使用 -force 选项)
2. 复制输出的 SQL 脚本并在 SQL Server Management Studio 中运行


0

我刚遇到了完全相同的问题,我知道这个帖子已经一年了,但也许它会帮助其他人。

我试图在使用下面的连接字符串的Package Manager Console中创建实体5数据库。

update-database -ConfigurationTypeName My.Project.EF.Migrations.Configuration -ConnectionStringName MyDatabaseDev -ProjectName Project.Name -StartUpProjectName Database.Name

每次运行时都会出现以下错误。

超时已过期。操作完成之前超时时间已过或服务器未响应。

为了解决这个问题,我只需添加-force参数即可轻松通过。


5
添加"-force"对我没有用。我需要应用的迁移很多,而且我正在使用EF6,与上面提到的6.1相比效率较低。在VS项目的Migrations文件夹中有一个名为Configuration.cs的类。我在该类的构造函数中添加了属性CommandTimeout = Int32.MaxValue;。这个改变允许update-database命令最终完成而没有错误。 - voidmain
@voidmain -force 对我也没用,你的 CommandTimeout 设置完美解决了问题。感谢你的有价值的评论。 - Charl

0

我在生产环境中遇到了这个问题,因为它生成的查询就像这里所示的一样:为什么Entity Framework 6会为简单的查找生成复杂的SQL查询?

实际上,这与EF的这个版本中存在的一个bug有关:https://entityframework.codeplex.com/workitem/2083

他们将默认的null语义从5更改为6,所以我猜你在升级后遇到了和我一样的问题。我的机器的数据只是远程安装的一小部分,直到进入生产环境之前,我才知道自己有性能问题。查询通常会产生表扫描,对于较大的表可能会超时。

要将其更改回像EF5那样工作,您必须设置:

DbContextConfiguration.UseDatabaseNullSemantics = true

看这里:http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.usedatabasenullsemantics(v=vs.113).aspx EF 6.1中修复了这个bug,但你仍然需要设置上述选项来获取简单的where条件。

0
我也遇到了这个错误,尝试使用各种命令超时设置,但发现没有任何作用。后来我发现我的问题不是超时问题,而是SQL事务问题。显然,我的代码与我之前运行的SQL事务冲突。当时,该事务未提交或回滚。一旦我运行了COMMIT语句,问题就解决了。
记得始终要COMMIT或ROLLBACK你的事务。

0

验证是否存在未关闭的事务。这种情况今天发生在我身上,导致执行Scaffold-DbContext命令超时,因为数据库被锁定,Scaffold-DbContext命令无法运行。

关闭所有未关闭的事务,然后再试一次。


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - pat8719

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接