remarks generate example c# asp.net entity-framework entity-framework-4 connection-string

c# - generate - Entidades temporales del marco de la entidad



params comments c# (7)

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

Así que, aquí vamos:

Si usa LINQ con EF, busque 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 contiene más de un Id.

El problema del "tiempo de espera" aparece si la lista contiene solo un Id. Para resolver el problema, use if condition para verificar el número de identificadores 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 intente usar Sql Profiler y verifique la instrucción Select generada por Entity frameeork. ...

Estoy obteniendo tiempos de espera utilizando el Entity Framework (EF) al usar una función de importación que demora más de 30 segundos. Intenté lo siguiente y no he podido resolver este problema:

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

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" />

Intenté configurar el CommandTimeout en mi repositorio directamente así:

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

¿Qué más puedo hacer para obtener el EF de tiempo de espera? Esto solo ocurre con conjuntos de datos muy grandes. Todo funciona bien con pequeños conjuntos de datos.

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

System.Data.EntityCommandExecutionException: se produjo un error al ejecutar la definición del comando. Vea la excepción interna para más detalles. ---> System.Data.SqlClient.SqlException: Tiempo de espera caducado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde.

OK, tengo este trabajo y es tonto lo que pasó. Tenía tanto la cadena de conexión con el Default Command Timeout=300000 como el CommandTimeout establecido en 180. Cuando eliminé el Default Command Timeout de Default Command Timeout de la cadena de conexión, funcionó. Entonces, la respuesta es configurar manualmente el CommandTimeout en su repositorio en su objeto de contexto de la siguiente manera:

this.context.CommandTimeout = 180;

Aparentemente, establecer la configuración del tiempo de espera en la cadena de conexión no tiene ningún efecto en ella.


Existe 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 configúrelo en el propio objeto de contexto de datos. Esto funcionará si elimina el valor conflictivo de la cadena de conexión.

Entity Framework Core 1.0:

this.context.Database.SetCommandTimeout(180);

Entidad marco 6:

this.context.Database.CommandTimeout = 180;

Entidad marco 5:

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

Entity Framework 4 y más abajo:

this.context.CommandTimeout = 180;


Generalmente manejo mis operaciones dentro de una transacción . Como he experimentado, no es suficiente establecer el tiempo de espera del comando de contexto, pero la transacción necesita un constructor con un parámetro de tiempo de espera. Tuve que establecer ambos valores de tiempo de espera para que funcione 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, puse de nuevo el tiempo de espera del comando en el valor anterior en prevto.

Utilizando EF6


Sé que este es un subproceso muy antiguo en ejecución, pero aún EF no lo ha solucionado. Las personas que usan DbContext generado DbContext pueden usar 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; }


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

this.context.Database.CommandTimeout = 180;


Si está utilizando Entity Framework como yo, debe definir el Tiempo de espera en la clase de inicio de la siguiente manera:

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));


Si está utilizando un DbContext, use 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 } }