Entity Framework - Entidades desconectadas

En este capítulo, veamos cómo realizar cambios en las entidades que no están siendo rastreadas por un contexto. Las entidades que no están siendo rastreadas por un contexto se conocen como entidades 'desconectadas'.

  • Para la mayoría de las aplicaciones de un solo nivel, donde la interfaz de usuario y las capas de acceso a la base de datos se ejecutan en el mismo proceso de aplicación, probablemente solo realizará operaciones en entidades que están siendo rastreadas por un contexto.

  • Las operaciones en entidades desconectadas son mucho más comunes en aplicaciones N-Tier.

  • Las aplicaciones de N-Tier implican obtener algunos datos en un servidor y devolverlos, a través de la red, a una máquina cliente.

  • Luego, la aplicación cliente manipula estos datos antes de devolverlos al servidor para que se conserven.

A continuación se muestran los dos pasos que se deben seguir con el gráfico de entidad desconectada o incluso con una sola entidad desconectada.

  • Adjunte entidades con la nueva instancia de contexto y haga que el contexto conozca estas entidades.

  • Configure EntityStates apropiados para estas entidades manualmente.

Echemos un vistazo al siguiente código en el que se agrega la entidad Student con dos entidades Enrollment.

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram", 

         EnrollmentDate = DateTime.Parse("2015-10-10"), 
            Enrollments = new List<Enrollment> {

               new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 },
               new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 },
         }
      };

      using (var context = new UniContextEntities()) {

         context.Students.Add(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", 
               enrollment.EnrollmentID, context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   } 
}
  • El código construye una nueva instancia de Student, que también hace referencia a dos nuevas instancias de Enrollment en su propiedad Enrollments.

  • Luego, el nuevo Estudiante se agrega a un contexto usando el método Agregar.

  • Una vez que se agrega el estudiante, el código usa el método DbContext.Entry para obtener acceso a la información de seguimiento de cambios que Entity Framework tiene sobre el nuevo estudiante.

  • A partir de esta información de seguimiento de cambios, la propiedad State se utiliza para escribir el estado actual de la entidad.

  • Luego, este proceso se repite para cada una de las Inscripciones recién creadas a las que se hace referencia desde el nuevo Estudiante. Si ejecuta la aplicación, recibirá el siguiente resultado:

New Student   (Wasim  Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...

Mientras que DbSet.Add se usa para informar a Entity Framework sobre nuevas entidades, DbSet.Attach se usa para informar a Entity Framework sobre entidades existentes. El método Attach marcará una entidad en el estado Sin cambios.

Echemos un vistazo al siguiente código C # en el que se adjunta una entidad desconectada con DbContext.

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram",
         EnrollmentDate = DateTime.Parse("2015-10-10"), 

         Enrollments = new List<Enrollment> {
            new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 },
            new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 },
         }
			
      };

      using (var context = new UniContextEntities()) {

         context.Students.Attach(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID, 
               context.Entry(enrollment).State);
         }

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

Cuando el código anterior se ejecuta con el método Attach (), recibirá el siguiente resultado.

New Student   (Wasim  Akram): Unchanged
Enrollment ID: 2001 State: Unchanged
Enrollment ID: 2002 State: Unchanged
Press any key to exit...