为这个措辞奇怪的问题道歉。我不知道实际问题是什么,但希望有人可以给我一些见解。
尝试运行迁移时出现以下错误:
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
值得注意的是,在我的笔记本电脑上,这种情况并没有发生,但在我的VM(天蓝色 - 大)上,这种情况发生率为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://stackoverflow.com/a/6234593/305469
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.
答案 0 :(得分:17)
在Configuration.cs类的构造函数中(在迁移文件夹中)添加属性CommandTimeout = Int32.MaxValue;
答案 1 :(得分:6)
我重新启动了SQL Server服务(Win7 - 计算机管理&gt;服务和应用程序&gt;服务)
答案 2 :(得分:1)
对我来说,问题是迁移脚本需要很长时间才能运行(15分钟)。
这就是我解决这个问题的方法:
1.运行update-database -script
(可能需要-force
)
2.复制此SQL脚本输出并在SQL Server Management Studio中运行
答案 3 :(得分:0)
我在生产环境中遇到过这个问题,因为它产生了类似于以下内容的查询:Why does Entity Framework 6 generate complex SQL queries for simple lookups?
这实际上与此版本的EF中的错误有关:https://entityframework.codeplex.com/workitem/2083
他们将默认的空语义从5改为6,所以我猜你在升级后遇到了同样的问题。我的机器只有一小部分数据作为我的远程安装,直到我投入生产,我都不知道我遇到了性能问题。查询通常会产生一个表扫描,这将超时更大的表。
要更改它以使其像EF5一样工作,您必须设置:
DbContextConfiguration.UseDatabaseNullSemantics = true
该错误已在EF 6.1中修复,但您仍需设置上述选项,以便在条件适用的情况下使用。
答案 4 :(得分:0)
我刚才有同样的问题,我知道这个帖子已经有一年了,但也许会帮助其他人。
我尝试使用下面的连接字符串使用程序包管理器控制台在实体5中创建数据库。
update-database -ConfigurationTypeName My.Project.EF.Migrations.Configuration -ConnectionStringName MyDatabaseDev -ProjectName Project.Name -StartUpProjectName Database.Name
每次我运行它时都会出现以下错误。
超时已过期。操作完成之前经过的超时时间或服务器没有响应。
要解决此问题,我只需添加 -force 参数即可。
答案 5 :(得分:0)
FYI EF迁移从单独的配置中提取超时:
public class MyContextConfiguration : DbMigrationsConfiguration<MyContext>
{
public MyContextConfiguration()
{
CommandTimeout = 900;
}
}
将900更改为更高的值,其他所有SQL超时更改(web.config等)都没有执行任何操作,这对我有用。
答案 6 :(得分:0)
我也遇到了这个错误,并尝试使用各种命令超时设置,但发现没有任何效果。过了一会儿,我发现我的问题不是超时问题,而是 SQL 事务问题。显然,我的代码与我之前运行的 SQL 事务发生冲突。当时,事务未提交或回滚。运行 COMMIT 语句后,问题自行解决。
请记住始终提交或回滚您的交易。