mvc framework first example español curso c# entity-framework

c# - example - entity framework database first



¿Debería el contexto del marco de la entidad ponerse en la declaración de uso? (9)

El objeto de contexto de Entity Framework implementa un método Dispose () que "Libera los recursos utilizados por el contexto del objeto". ¿Qué es lo que realmente hace? ¿Sería algo malo ponerlo siempre en una declaración de {} uso? Lo he visto usar tanto con y sin la declaración de uso.

Específicamente voy a usar el contexto EF desde dentro de un método de servicio WCF, crear el contexto, hacer algo de linq y devolver la respuesta.

EDITAR: Parece que no soy el único que se pregunta sobre esto. Otra pregunta es qué está sucediendo realmente dentro del método Dispose (). Algunos dicen que cierra las conexiones, y algunos artículos dicen que no. ¿Cual es el trato?


Como no sabe cuándo el recolector de basura dispone de un artículo, siempre es bueno envolver los objetos que implementan IDisposable en un bloque de uso si sabe cuándo ha terminado.


Cuando desecha, ObjectContext dispone otros objetos propios.

Incluyendo cosas como la EntityConnection que envuelve la conexión de la base de datos real, es decir, generalmente una conexión Sql.

Entonces ''si'' la conexión Sql está abierta, se cerrará cuando elimine el ObjectContext.


EF5 y versión anterior

using { ... // connecction open here. ... context.Blogs.Add(blog); context.SaveChanges(); // query etc now opens and immediately closes ... context.Blogs.Add(blog); context.SaveChanges(); // query etc now opens and immediately closes }

EF6 y después de la versión

using { // connecction open here. ... context.Blogs.Add(blog); context.SaveChanges(); // The underlying store connection remains open for the next operation ... context.Blogs.Add(blog); context.SaveChanges(); // The underlying store connection is still open } // The context is disposed – so now the underlying store connection is closed

Referencia: http://msdn.microsoft.com/en-us/data/dn456849#open5


Me he dado cuenta (aunque en una sola aplicación) de que la eliminación explícita causaba excepciones de interrupción de subprocesos en mscorlib que se detectan antes del código de la aplicación, pero al menos en mi caso resulta en un golpe de rendimiento notable. No he hecho ninguna investigación significativa sobre el tema, pero probablemente algo que valga la pena considerar si estás haciendo esto. Simplemente mire su salida DEBUG para ver si está obteniendo el mismo resultado.


Per Progamming Entity Framework : "Puede disponer explícitamente ObjectContext o esperar a que el recolector de basura haga el trabajo".

En resumen, aunque no se requiere la instrucción de uso, es recomendable si sabe que ha terminado de utilizar ObjectContext, ya que el recurso se libera inmediatamente en lugar de esperar la recolección de elementos no utilizados.


Realmente probé esto tanto para ADO.net como para EF v.6 y vi conexiones en la tabla SQL

select * from sys.dm_exec_connections

Los métodos que se probaron tenían este aspecto:

1) ADO.net con el uso

using(var Connection = new SqlConnection(conString)) { using (var command = new SqlCommand(queryString, Connection)) { Connection.Open(); command.ExecuteNonQueryReader(); throw new Exception() // Connections were closed after unit-test had been //finished. Expected behaviour } }

2) ADO.net con nuestro uso

var Connection = new SqlConnection(conString); using (var command = new SqlCommand(queryString, Connection)) { Connection.Open(); command.ExecuteNonQueryReader(); throw new Exception() // Connections were NOT closed after unit-test had been finished finished. I closed them manually via SQL. Expected behaviour }

1) EF con usar.

using (var ctx = new TestDBContext()) { ctx.Items.Add(item); ctx.SaveChanges(); throw new Exception() // Connections were closed, as expected. }

2) EF sin usar

var ctx = new TestDBContext(); ctx.Items.Add(item); ctx.SaveChanges(); throw new Exception() // Connections WERE successfully closed, as NOT expected.

No sé por qué es así, pero EF cerró las conexiones automáticamente. Además, todos los patrones de repositorio y UnitOfWork que usan EF no usan. Es muy extraño para mí, porque DBContext es de tipo Desechable, pero es un hecho.

Tal vez en Microsoft hicieron algo nuevo para manejar?


Si Dispose cierra la conexión a DB, es una mala idea llamarlo. Por ejemplo, en las conexiones ADO.NET están en el grupo de conexiones y nunca se cierran antes de que se agote el tiempo de espera o el grupo de aplicaciones.


Siempre, si crea una instancia de una clase que implementa IDisposable, entonces usted es responsable de llamar a Dispose. En todos menos en uno, esto significa un bloque de uso .


Si crea un contexto, debe eliminarlo más tarde. Si debe usar la instrucción using , depende del tiempo de vida del contexto.

  1. Si crea el contexto en un método y lo usa solo dentro de este método, realmente debería usar la instrucción using porque le proporciona el manejo de excepciones sin ningún código adicional.

  2. Si utiliza el contexto durante un período más largo, es decir, el tiempo de vida no está vinculado por el tiempo de ejecución de un método, no puede usar la instrucción using y debe llamar a Dispose() y tener cuidado de que siempre lo llame.

¿Qué hace Dispose() para un contexto de objeto?

No miré el código, pero al menos espero que cierre la conexión de la base de datos con sus sockets subyacentes o con los recursos que use el mecanismo de transporte.