c# - first - Entity Framework: ¿cuál es el valor actual del tiempo de espera del comando?
entity framework example (5)
- ¿Quién es el proveedor subyacente?
Para conectarse a cualquier base de datos de forma remota y realizar consultas SQL, necesita un mecanismo o un mediador (puede decir) que entienda la semántica de comunicación de las distintas acciones que deben realizarse al ejecutar una consulta, por ejemplo, crear un comando, establecer una conexión, cuidar el tiempo de espera de la conexión. reintentar etc.
Todas estas responsabilidades están a cargo de los proveedores de la base de datos a la que intenta conectarse. Estos proveedores tendrán diferentes implementaciones y clases en el entorno (C #, Java, Python, Perl, etc.) desde el que se está conectando. Por lo tanto, para conectarse a una base de datos MySQL tendrá diferentes proveedores para el mundo de programación java, .net o python.
- ¿Cómo puedo leer (a través del código EF) el valor del tiempo de espera de comando actual en este caso?
No Esto no es posible. Si observa detenidamente la propiedad dbContext.Database.CommandTimeout
, es de tipo int?
. Entonces, la logística de mantener esta propiedad como nullable int es solo para representar el valor predeterminado (como nulo). Entity Framework (EF) no expone nada hasta que haya establecido un valor explícito en el código C #. Verifiqué esto contra las siguientes bases de datos
- MySQL
- servidor SQL
En ambos casos, veo que después de crear el objeto de contexto DB, la propiedad de tiempo de espera del comando se establece en null
que sugiere que está usando el valor predeterminado proporcionado por el proveedor subyacente.
Pero sí, si lo ha establecido en un valor no nulo una vez en su código C # a través de la propiedad dbContext.Database.CommandTimeout
, entonces, por dbContext.Database.CommandTimeout
, puede volver a leerlo ya que es una propiedad de conjunto de objetos en el objeto de comando. Siempre le mostrará el nuevo valor que se estableció explícitamente en el código.
Si lo vuelve a establecer en null
, EF comenzará nuevamente a usar el tiempo de espera predeterminado del proveedor subyacente.
Uso de clases de proveedor en lugar de la capa EF : si no usa la capa ORM del marco de la entidad y en su lugar usa las clases centrales del proveedor, entonces ciertamente puede ver el valor de tiempo de espera predeterminado en la inicialización. Como cuando ejecuté el código mencionado para una MySQL
datos MySQL
con un valor de tiempo de espera de comando predeterminado ya establecido en la propia cadena de conexión, puedes ver 40.
private static void TestingCommandTimeOutInMySql()
{
string connetionString = "Server=localhost;Database=sakila;Uid=root;Pwd=Passw0rd;default command timeout=40;";
MySqlConnection con = new MySqlConnection(connetionString);
try
{
cnn.Open();
Console.WriteLine("Connection Open ! ");
MySqlCommand cmd = new MySqlCommand("select * from actor", con);
var timeoutValue = cmd.CommandTimeout; //shows 40
con.Close();
}
catch (Exception ex)
{
Console.WriteLine("Can not open connection ! ");
}
}
Si no establece nada en la cadena de conexión, muestra un valor predeterminado de 30 para MySQL. Aquí el CommandTimeout
es int
, NO int?
. Por lo tanto, EF ciertamente aplica algo de inteligencia al exponer esta propiedad de clases de proveedor que finalmente están expuestas por EF a través de dbContext.Database.CommandTimeout
. EF es solo un contenedor sobre estas clases de proveedores con algo de inteligencia adicional.
Algunos detalles adicionales con respecto a las picaduras de conexión:
Para el proveedor de SQL Server: los formatos de cadena de conexión de Microsoft SQL Server no proporcionan ninguna propiedad con la ayuda de la cual puede establecer un tiempo de espera de ejecución de comando personalizado. Por lo tanto, establecer un valor durante la inicialización del proveedor de SQL Server simplemente no es posible. Siempre se puede cambiar el valor en el código C # después de la iniciación / inicialización. Puedes ver más detalles here .
Para el proveedor de MySQL: Mis formatos de cadena de conexión de SQL tienen un soporte para establecer explícitamente el tiempo de espera predeterminado del comando. Puedes encontrar los detalles here . Puede mencionar un valor de tiempo de espera de comando predeterminado personalizado en la cadena de conexión de MySQL de esta manera:
default command timeout=200;
Estoy utilizando Entity Framework 5 y deseo saber el valor del tiempo de espera del comando.
Para hacerlo, lanzo el objeto dbContext a un ObjectContext y accedo a la propiedad CommandTimeout.
int ? currentCommandTimeout = ((IObjectContextAdapter)dbContext).ObjectContext.CommandTimeout;
El valor actual de esta propiedad es nulo, lo que significa que el tiempo de espera del comando actual es el valor predeterminado del proveedor subyacente.
- ¿Quién es el proveedor subyacente?
- ¿Cómo puedo leer (a través del código EF) el valor del tiempo de espera de comando actual en este caso?
Referencia de propiedad de MSDN ObjectContext CommandTimeout
EDITAR: Gracias por explicar cómo establecer el tiempo de espera del comando y encontrar el valor predeterminado del tiempo de espera del comando en la documentación. Sin embargo, la pregunta sigue abierta. ¿Cómo, si es posible, puede leer el valor del tiempo de espera del comando en caso de incumplimiento, a través de EF?
Así es como lo hago.
ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext
int commandTimeout = objectContext.CommandTimeout
?? objectContext.Connection.CreateCommand().CommandTimeout;
Desde MSDN,
- La propiedad CommandTimeout obtiene o establece el valor de tiempo de espera, en segundos, para todas las operaciones de contexto de objeto.
- Un valor
null
indica que se utilizará el valor predeterminado del proveedor subyacente.
Por lo tanto, si no lo configura explícitamente a través del código o lo pasa en su cadena de conexión (en MySQL), entonces es el valor predeterminado de su proveedor.
Si desea ver un valor que no sea nulo para CommandTimeout
, deberá pasarlo en connectionString o establecerlo a través del código.
¿Quién es el proveedor subyacente?
Proveedor subyacente es el que está pasando en su cadena de conexión como providerName
<connectionStrings>
<clear />
<add name="Name"
providerName="System.Data.ProviderName"
connectionString="Valid Connection String;" />
</connectionStrings>
Aquí, System.Data.ProviderName
es su proveedor subyacente.
Si está utilizando MySql o MS Sql, de acuerdo con la documentación de MySql y MSDN ,
- El valor predeterminado es
30 secs
. Un valor de 0 indica una espera indefinida y debe evitarse.
Nota :
El tiempo de espera predeterminado del comando se puede cambiar utilizando el atributo de Default Command Timeout
conexión Default Command Timeout
de Default Command Timeout
en caso de proveedores de bases de datos MySQL.
Esto debería funcionar
var ctx = new DbContext();
ctx.Database.CommandTimeout = 120;
Si está utilizando SQLServer, el tiempo de espera predeterminado del comando es 30 segundos.