Entity Framework - DbContext

Entity Framework le permite consultar, insertar, actualizar y eliminar datos mediante objetos Common Language Runtime (CLR) que se conocen como entidades. Entity Framework asigna las entidades y relaciones que se definen en su modelo a una base de datos. También proporciona instalaciones para:

  • Materializar los datos devueltos desde la base de datos como objetos de entidad
  • Seguimiento de los cambios realizados en los objetos.
  • Manejar concurrencia
  • Propagar cambios de objetos de nuevo a la base de datos
  • Vincular objetos a controles

La clase principal responsable de interactuar con los datos como objetos es System.Data.Entity.DbContext. La API de DbContext no se publica como parte de .NET Framework. Para ser más flexible y frecuente con el lanzamiento de nuevas funciones para Code First y la API DbContext, el equipo de Entity Framework distribuye EntityFramework.dll a través de la función de distribución NuGet de Microsoft.

  • NuGet le permite agregar referencias a sus proyectos .NET extrayendo las DLL relevantes directamente en su proyecto desde la Web.

  • Una extensión de Visual Studio denominada Administrador de paquetes de biblioteca proporciona una manera fácil de extraer el ensamblado adecuado de la Web a sus proyectos.

  • La API de DbContext está principalmente dirigida a simplificar su interacción con Entity Framework.

  • También reduce la cantidad de métodos y propiedades que necesita para acceder a las tareas de uso común.

  • En versiones anteriores de Entity Framework, estas tareas a menudo eran complicadas de descubrir y codificar.

  • La clase de contexto administra los objetos de la entidad durante el tiempo de ejecución, lo que incluye completar objetos con datos de una base de datos, seguimiento de cambios y datos persistentes en la base de datos.

Definición de una clase derivada de DbContext

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

El siguiente código es un ejemplo simple que muestra que UniContext se deriva de DbContext.

  • Puede utilizar propiedades automáticas con DbSet como getter y setter.

  • También crea un código mucho más limpio, pero no es necesario que lo use con el propósito de crear un DbSet cuando no tiene otra lógica para aplicar.

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • Anteriormente, EDM solía generar clases de contexto que se derivaban de la clase ObjectContext.

  • Trabajar con ObjectContext fue un poco complejo.

  • DbContext es un contenedor de ObjectContext que en realidad es similar a ObjectContext y es útil y fácil en todos los modelos de desarrollo, como Code First, Model First y Database First.

Consultas

Hay tres tipos de consultas que puede utilizar, como:

  • Añadiendo una nueva entidad.
  • Cambiar o actualizar los valores de propiedad de una entidad existente.
  • Eliminar una entidad existente.

Agregar nuevas entidades

Agregar un nuevo objeto con Entity Framework es tan simple como construir una nueva instancia de su objeto y registrarlo usando el método Add en DbSet. El siguiente código es para cuando desee agregar un nuevo estudiante a la base de datos.

private static void AddStudent() {

   using (var context = new UniContext()) {

      var student = new Student {
         LastName = "Khan", 
         FirstMidName = "Ali", 
         EnrollmentDate = DateTime.Parse("2005-09-01") 
      };

      context.Students.Add(student); 
      context.SaveChanges();

   }
}

Cambio de entidades existentes

Cambiar objetos existentes es tan simple como actualizar el valor asignado a las propiedades que desea cambiar y llamar a SaveChanges. En el siguiente código, el apellido de Ali se ha cambiado de Khan a Aslam.

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

Eliminar entidades existentes

Para eliminar una entidad usando Entity Framework, usa el método Remove en DbSet. Elimina trabajos para entidades existentes y recién agregadas. Llamar a Eliminar en una entidad que se ha agregado pero que aún no se ha guardado en la base de datos cancelará la adición de la entidad. La entidad se elimina del rastreador de cambios y DbContext ya no la rastrea. Llamar a Eliminar en una entidad existente a la que se está realizando un seguimiento de cambios registrará la entidad para su eliminación la próxima vez que se llame a SaveChanges. El siguiente ejemplo muestra una instancia en la que se elimina al estudiante de la base de datos cuyo nombre es Ali.

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}