Trabajar con DbContext

Para usar Entity Framework para consultar, insertar, actualizar y eliminar datos mediante objetos .NET, primero debe crear un modelo que asigne las entidades y relaciones definidas en el modelo a las tablas de una base de datos.

Una vez que tenga un modelo, la clase principal con la que interactúa la aplicación es System.Data.Entity.DbContext (a menudo denominada clase de contexto). Puede usar DbContext asociado a un modelo para:

  • Escribir y ejecutar consultas
  • Materializar los resultados de la consulta como objetos de entidad
  • Hacer un seguimiento de los cambios realizados en esos objetos
  • Conservar los cambios de objeto en la base de datos
  • Enlazar objetos en la memoria a controles de interfaz de usuario

En esta página se proporcionan algunas instrucciones sobre cómo administrar la clase de contexto.

Definición de una clase derivada de DbContext

La manera recomendada de trabajar con contexto es definir una clase que deriva de DbContext y expone las propiedades DbSet que representan colecciones de las entidades especificadas en el contexto. Si trabaja con EF Designer, se generará el contexto automáticamente. Si trabaja con Code First, normalmente escribirá el contexto usted mismo.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

Una vez que tenga un contexto, consultaría, agregaría (con los métodos Add o Attach) o quitaría (con Remove) entidades en el contexto a través de estas propiedades. El acceso a una propiedad DbSet en un objeto de contexto representa una consulta inicial que devuelve todas las entidades del tipo especificado. Tenga en cuenta que solo el acceso a una propiedad no ejecutará la consulta. Una consulta se ejecuta cuando:

  • Se enumera mediante una instrucción foreach (C#) o For Each (Visual Basic).
  • Se enumera mediante una operación de colección tal como ToArray, ToDictionary o ToList.
  • Los operadores LINQ, tal como First o Any, se especifican en la parte más externa de la consulta.
  • Se llama a uno de los métodos siguientes: el método de extensión Load, DbEntityEntry.Reload, Database.ExecuteSqlCommandy DbSet<T>.Find, si no se encuentra una entidad con la clave especificada ya cargada en el contexto.

Período de duración

La duración del contexto comienza cuando se crea la instancia y finaliza cuando se elimina o se somete a la recolección de elementos no utilizados. Utilice en uso si quiere que todos los recursos que controla el contexto sean eliminados al final del bloque. Cuando usa en uso, el compilador crea automáticamente un bloque intentar/por fin y llama a disponer en el bloque por fin.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

A continuación se ofrecen algunas instrucciones generales para decidir la duración del contexto del objeto:

  • Al trabajar con aplicaciones web, utilice una instancia de contexto de objeto por solicitud.
  • Al trabajar con Windows Presentation Foundation (WPF) o Windows Forms, utilice una instancia de contexto por formulario. Esto permite utilizar la funcionalidad de seguimiento de cambios que proporciona el contexto.
  • Si un contenedor de inserción de dependencias crea la instancia de contexto, normalmente es responsabilidad del contenedor eliminar el contexto.
  • Si el contexto se crea en el código de la aplicación, recuerde eliminar el contexto cuando ya no sea necesario.
  • Al trabajar con un contexto de ejecución prolongada, tenga en cuenta lo siguiente:
    • A medida que carga más objetos y sus referencias en memoria, el consumo de memoria del contexto puede aumentar rápidamente. lo que puede ocasionar problemas de rendimiento.
    • El contexto no es seguro para los subprocesos, por lo que no debe compartirse entre varios subprocesos que realizan trabajo simultáneamente.
    • Si una excepción provocó que el estado del contexto fuese irrecuperable, quizá finalice la aplicación completa.
    • Las posibilidades de que haya problemas relacionados con la simultaneidad se incrementan a medida que aumenta la distancia entre el momento en que se consultan los datos y el momento en que se actualizan.

Conexiones

De forma predeterminada, el contexto administra las conexiones con la base de datos. El contexto abre y cierra las conexiones según sea necesario. Por ejemplo, el contexto abre la conexión para ejecutar una consulta y la cierra después, cuando se han procesado todos los conjuntos de resultados.

Hay casos en los que se desea más control sobre el momento en que se abre y cierra la conexión. Por ejemplo, al trabajar con SQL Server Compact, a menudo se recomienda mantener una conexión abierta independiente a la base de datos durante la vigencia de la aplicación para mejorar el rendimiento. Puede administrar este proceso manualmente mediante la propiedad Connection.