Entity Framework: operaciones de base de datos

En los capítulos anteriores, aprendió tres formas diferentes de definir un modelo de datos de entidad.

  • Dos de ellos, Database First y Model First, dependían del diseñador de Entity Framework combinado con la generación de código.

  • El tercero, Code First, le permite omitir un diseñador visual y simplemente escribir su propio código.

  • Independientemente de la ruta que elija, terminará con clases de dominio y una o más clases de Entity Framework DbContext le permiten recuperar y conservar datos relevantes para esas clases.

La API de DbContext en sus aplicaciones se utiliza como puente entre sus clases y su base de datos. DbContext es una de las clases más importantes de Entity Framework.

  • Permite expresar y ejecutar consultas.

  • Toma los resultados de la consulta de la base de datos y los transforma en instancias de nuestras clases de modelo.

  • Puede realizar un seguimiento de los cambios en las entidades, incluida la adición y eliminación, y luego activa la creación de declaraciones de inserción, actualización y eliminación que se envían a la base de datos a pedido.

A continuación se muestran las clases de contexto de anuncios de dominio en las que realizaremos diferentes operaciones en este capítulo. Este es el mismo ejemplo que hemos creado en el capítulo, Primer enfoque de la base de datos.

Implementación de clases de contexto

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;

namespace DatabaseFirstDemo {

   public partial class UniContextEntities : DbContext {

      public UniContextEntities(): base("name = UniContextEntities") {}

      protected override void OnModelCreating(DbModelBuilder modelBuilder) {
         throw new UnintentionalCodeFirstException();
      }

      public virtual DbSet<Course> Courses { get; set; }
      public virtual DbSet<Enrollment> Enrollments { get; set; }
      public virtual DbSet<Student> Students { get; set; }
   }
}

Implementación de clases de dominio

Clase del curso

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic;
	
   public partial class Course {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Course() {
         this.Enrollments = new HashSet<Enrollment>();
      }
	
      public int CourseID { get; set; }
      public string Title { get; set; }
      public int Credits { get; set; }
	
      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2227:CollectionPropertiesShouldBeReadOnly")]
			
      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
}

Clase de estudiante

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic; 

   public partial class Student {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Student() {
         this.Enrollments = new HashSet<Enrollment>();
      }

      public int ID { get; set; }
      public string LastName { get; set; }
      public string FirstMidName { get; set; }
      public System.DateTime EnrollmentDate { get; set; }

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2227:CollectionPropertiesShouldBeReadOnly")]
			
      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
}

Clase de matrícula

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic; 

   public partial class Enrollment {

      public int EnrollmentID { get; set; }
      public int CourseID { get; set; }
      public int StudentID { get; set; }
      public Nullable<int> Grade { get; set; }
		
      public virtual Course Course { get; set; }
      public virtual Student Student { get; set; }
   }
}

Crear operación

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 le permite agregar un nuevo estudiante a la base de datos.

class Program {

   static void Main(string[] args) {

      var newStudent = new Student();

      //set student name

      newStudent.FirstMidName = "Bill";
      newStudent.LastName = "Gates";
      newStudent.EnrollmentDate = DateTime.Parse("2015-10-21");
      newStudent.ID = 100;

      //create DBContext object

      using (var dbCtx = new UniContextEntities()) {

         //Add Student object into Students DBset
         dbCtx.Students.Add(newStudent);

         // call SaveChanges method to save student into database
         dbCtx.SaveChanges();
      }
   }
}

Operación de actualización

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

using (var context = new UniContextEntities()) {

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

Eliminar operación

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 es de un código en el que se elimina al alumno de la base de datos cuyo nombre es Ali.

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

Leer operación

Leer los datos existentes de la base de datos es muy sencillo. A continuación se muestra el código en el que se recuperan todos los datos de la tabla de Estudiantes y luego se mostrará un programa con el nombre y apellido de los estudiantes en orden alfabético.

using (var db = new UniContextEntities()) {

   var query = from b in db.Students orderby b.FirstMidName select b;
   Console.WriteLine("All All student in the database:");

   foreach (var item in query) {
      Console.WriteLine(item.FirstMidName +" "+ item.LastName);
   }

   Console.WriteLine("Press any key to exit...");
   Console.ReadKey();
}