¿Por qué reiniciar el DbContext al usar Entity Framework?

No sé si existe una forma mejor de usar el DbContext porque no se recomienda establecer como estático cuando se trabaja con WCF . Entonces lo estamos creando cada vez que queremos acceder a la base de datos.

Al conocer todas las ventajas del uso de Entity Framework, algunos se vuelven inútiles ya que estamos recreando el DbContext cada vez; y más puede causar gastos generales ya que se debe considerar el proceso de creación de grandes modelos de entidades.

¿Cuál es tu opinión?

Gestionando Lifetime

Tiene razón en que, por lo general, no se recomienda una única instancia estática de DbContext :

Cuanto más use un ObjectContext, generalmente, cuanto más grande se vuelve. Esto se debe a que contiene una referencia a todas las Entidades que ha conocido alguna vez, esencialmente lo que usted ha consultado, agregado o adjuntado. Por lo tanto, debería reconsiderar compartir el mismo ObjectContext indefinidamente.

Estos comentarios se aplican directamente a DbContext , porque se ajusta a ObjectContext para exponer “API simplificadas y más intuitivas”. [ ver documentación ]


Costo de construcción

La sobrecarga de crear el contexto es relativamente baja:

La realidad es que este costo es bastante bajo, porque en su mayor parte simplemente implica copiar, por referencia, metadatos de un caché global en el nuevo ObjectContext. En general, no creo que valga la pena preocuparse por este costo …

La forma más común de trabajar con un contexto efímero es envolverlo en un bloque de uso:

 using(DbContext context = new SomeDbContext()) { // Do work with context } 

Para facilitar las pruebas, es posible que desee que su DbContext implemente alguna interfaz IDbContext , y cree una clase de fábrica ContextFactory where T : IDbContext para instanciar contextos.

Esto le permite intercambiar fácilmente cualquier IDbContext en su código (es decir, un contexto en memoria para burlarse de objetos ).


Recursos

  • MSDN: cómo decidir sobre la duración de tu ObjectContext
  • StackOverflow: instanciar un contexto en LINQ para Entidades

La mejor práctica para el desarrollo web parece ser “un contexto por solicitud web”, consulte Gestión de ciclo de vida de sesión adecuada / DbContext , cuando trabaje con WCF esto podría traducirse en un contexto por operación (es decir, un contexto por llamada de método WCF).

Hay diferentes maneras de lograr esto, pero una solución, probablemente no recomendada por diferentes razones, es crear una nueva instancia del contexto y pasarla al constructor de su clase de negocio:

 public void WCFMethod() { using (DBContext db = new DBContext()) { BusinessLogic logic = new BusinessLogic(db); logic.DoWork(); } }