Tiempos de espera de Entity Framework


Estoy obteniendo tiempos de espera usando Entity Framework (EF) cuando uso una importación de funciones que tarda más de 30 segundos en completarse. Probé lo siguiente y no he podido resolver este problema:

Agregué Default Command Timeout=300000a la cadena de conexión en la aplicación .Config archivo en el proyecto que tiene el archivo EDMX como se sugiere aquí .

Así es como se ve mi cadena de conexión:

<add 
    name="MyEntityConnectionString" 
    connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
       res://*/MyEntities.msl;
       provider=System.Data.SqlClient;provider connection string=&quot;
       Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
       Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
       MultipleActiveResultSets=True;Default Command Timeout=300000;&quot;"
    providerName="System.Data.EntityClient" />

He intentado configurar el CommandTimeout en mi repositorio directamente como entonces:

private TrekEntities context = new TrekEntities();

public IEnumerable<TrekMatches> GetKirksFriends()
{
    this.context.CommandTimeout = 180;
    return this.context.GetKirksFriends();
}

¿Qué más puedo hacer para que el EF no se agote? Esto solo sucede para conjuntos de datos muy grandes. Todo funciona bien con conjuntos de datos pequeños.

Aquí está uno de los errores que estoy recibiendo:

Sistema.Datos.EntityCommandExecutionException: Se produjo un error al ejecutar la definición del comando. Vea la excepción interna para más detalles. ---> Sistema.Datos.SqlClient.SQLException: Tiempo de espera expirado. El tiempo de espera transcurrido antes de la finalización de la operación o el el servidor no responde.


OK - Tengo esto funcionando y es una tontería lo que pasó. Tenía tanto la cadena de conexión con Default Command Timeout=300000 como el CommandTimeout establecido en 180. Cuando eliminé el Default Command Timeout de la cadena de conexión, funcionó. Así que la respuesta es configurar manualmente el CommandTimeout en su repositorio en su objeto context de la siguiente manera:

this.context.CommandTimeout = 180;

Al parecer, establecer la configuración de tiempo de espera en la cadena de conexión no tiene ningún efecto sobre ella.

Author: Community, 2011-06-04

7 answers

Hay un error conocido al especificar el tiempo de espera predeterminado del comando dentro de la cadena de conexión EF.

Http://bugs.mysql.com/bug.php?id=56806

Elimine el valor de la cadena de conexión y establézcalo en el propio objeto de contexto de datos. Esto funcionará si elimina el valor en conflicto de la cadena de conexión.

Entity Framework Core 1.0:

this.context.Database.SetCommandTimeout(180);

Entity Framework 6:

this.context.Database.CommandTimeout = 180;

Entity Framework 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

Entity Framework 4 y abajo:

this.context.CommandTimeout = 180;
 476
Author: Chev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 08:53:08

Si está utilizando un DbContext, utilice el siguiente constructor para establecer el tiempo de espera del comando:

public class MyContext : DbContext
{
    public MyContext ()
    {
        var adapter = (IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = 1 * 60; // value in seconds
    }
}
 93
Author: saille,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-17 21:52:49

Si está utilizando DbContext y EF v6+, alternativamente puede usar:

this.context.Database.CommandTimeout = 180;
 33
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-05 19:17:24

Normalmente manejo mis operaciones dentro de una transacción . Como he experimentado, no es suficiente establecer el comando context timeout, pero la transacción necesita un constructor con un parámetro timeout. Tuve que establecer ambos valores de tiempo de espera para que funcionara correctamente.

int? prevto = uow.Context.Database.CommandTimeout;
uow.Context.Database.CommandTimeout = 900;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) {
...
}

Al final de la función devuelvo el comando timeout al valor anterior en prevto.

Usando EF6

 8
Author: pillesoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-10 09:24:26

Sé que este es un hilo muy antiguo que se está ejecutando, pero aún así EF no lo ha arreglado. Para las personas que utilizan auto-generado DbContext puede utilizar el siguiente código para establecer el tiempo de espera manualmente.

public partial class SampleContext : DbContext
{
    public SampleContext()
        : base("name=SampleContext")
    {
        this.SetCommandTimeOut(180);
    }

    public void SetCommandTimeOut(int Timeout)
    {
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = Timeout;
    }
 3
Author: Shiva N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-13 16:15:34

Esto es lo que he financiado. Tal vez ayude a alguien:

Así que aquí vamos:

Si usa LINQ con EF buscando algunos elementos exactos contenidos en la lista como este:

await context.MyObject1.Include("MyObject2").Where(t => IdList.Contains(t.MyObjectId)).ToListAsync();

Todo va bien hasta que IdList contenga más de un Id.

El problema del "tiempo de espera" aparece si la lista contiene solo un Id. Para resolver el problema, use la condición if para verificar el número de ID en IdList.

Ejemplo:

if (IdList.Count == 1)
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.FirstOrDefault()==t. MyObjectId).ToListAsync();
}
else
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.Contains(t. MyObjectId)).ToListAsync();
}

Explicación:

Simplemente inténtalo para usar Sql Profiler y comprobar la instrucción Select generada por Entity frameork. …

 1
Author: tosjam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-31 12:00:32

Si está utilizando Entity Framework como yo, debe definir Time out en la clase de inicio de la siguiente manera:

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));
 0
Author: parismiguel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-01 17:52:40