web-dev-qa-db-fra.com

EF Code First - Délai expiré. Le délai d'attente s'est écoulé avant la fin

Des excuses pour cette question étrangement formulée. Je ne sais pas quel est le problème réel, mais j'espère que quelqu'un pourra me donner quelques informations.

J'obtiens l'erreur suivante lorsque j'essaie d'exécuter des migrations:

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

Il est intéressant de noter que sur mon ordinateur portable, cela ne se produit pas, mais sur mon VM (Azure - large), cela se produit avec un taux d'échec de 100%.

J'utilise Ef 6.0.0 -rc1 . Veuillez noter que la mise à jour d'EF n'est pas une option. En cas de mise à jour vers EF 6.0.0 ou 6.0.1, j'obtiendrai l'erreur suivante avec un taux d'échec de 100%:

Erreurs lors de la première migration du code

J'ai également chronométré l'erreur. Il faut environ 1,5 min pour déclencher l'erreur. Lors de l'exécution avec -Verbose signaler qu'il essayait de créer 200 tables avec des index. La copie de la requête SQL et son exécution dans SSMS prend 5 secondes.

Quelques choses que j'ai fatiguées mais qui n'ont pas fonctionné:

1) Réglage ObjectContext.CommandTimeout = 36000 // 10 hours! comme indiqué ici:

https://stackoverflow.com/a/6234593/305469

2) Définition du délai d'expiration dans la chaîne de connexion dans "web.config":

connectionString="Data Source=localhost;Initial Catalog=myDB;Integrated Security=SSPI;Connection Timeout=36000"

3) Définition de la transaction "machine.config" maxTimeout:

<system.transactions> <machineSettings maxTimeout="00:00:00" /> </system.transactions>

4) Définition du "délai de requête à distance" sur le serveur SQL

USE MyDB;
GO
EXEC sp_configure 'remote query timeout', 0 ;
GO
RECONFIGURE ;
GO

Alors qu'est-ce qui se passe? Comment se fait-il que CommandTimeout ne soit pas respecté? Aucune suggestion?

Trace complète comme suit:

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.
22
Chi Chan

Dans le constructeur de la classe Configuration.cs (dans le dossier de migration), ajoutez la propriété CommandTimeout = Int32.MaxValue;

17
Stephan

J'ai redémarré le service SQL Server (Win7 - Gestion de l'ordinateur> Services et applications> Services)

6
tennisBoy

Pour moi, le problème était que ce script de migration prenait beaucoup de temps à s'exécuter (15 minutes).

Voici comment j'ai travaillé autour du problème:
1. Courir update-database -script (-force peut être nécessaire)
2. Copiez cette sortie de script SQL et exécutez-la dans SQL Server Management Studio

1
Josh

J'ai rencontré cela dans mon environnement de production car il produisait des requêtes comme celles-ci: Pourquoi Entity Framework 6 génère-t-il des requêtes SQL complexes pour des recherches simples?

Ceci est en fait lié à un bogue dans cette version d'EF: https://entityframework.codeplex.com/workitem/208

Ils ont changé la sémantique nulle par défaut de 5 à 6, donc je suppose que vous avez eu le même problème que moi après la mise à niveau. Ma machine avait une fraction des données comme installation à distance et jusqu'à ce que j'arrive en production, je ne savais pas que j'avais un problème de performances. Les requêtes produisent souvent une analyse de table qui expire pour les tables plus grandes.

Pour le modifier afin qu'il fonctionne comme EF5, vous devez définir:

DbContextConfiguration.UseDatabaseNullSemantics = true

Voir ici: http://msdn.Microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.usedatabasenullsemantics (v = vs.113) .aspx

Le bug a été corrigé dans EF 6.1, mais vous devez toujours définir l'option ci-dessus pour obtenir des conditions Where simples.

0
GrokSrc

Je viens d'avoir le même problème exact, je sais que ce fil a un an mais peut-être qu'il aidera quelqu'un d'autre.

J'essayais de créer la base de données dans l'entité 5 à l'aide de la console du gestionnaire de packages à l'aide de la chaîne de connexion ci-dessous.

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

Chaque fois que je l'ai exécuté, j'ai eu l'erreur ci-dessous.

Le délai a expiré. Le délai d'expiration s'est écoulé avant la fin de l'opération ou le serveur ne répond pas.

Pour y remédier, j'ai simplement ajouté le paramètre - - force et il est passé à travers.

0
Craig Strohl

Une migration EF EFY tire son délai d'expiration d'une configuration distincte:

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

Remplacez le 900 par quelque chose de plus élevé, tous les autres changements de délai d'expiration SQL (web.config, etc.) n'ont rien fait, cela a fonctionné pour moi.

0
ransems