Entity Framework - Entità disconnesse

In questo capitolo, vediamo come apportare modifiche alle entità che non vengono tracciate da un contesto. Le entità che non vengono tracciate da un contesto sono note come entità "disconnesse".

  • Per la maggior parte delle applicazioni a livello singolo, in cui l'interfaccia utente e i livelli di accesso al database vengono eseguiti nello stesso processo dell'applicazione, probabilmente eseguirai solo operazioni su entità che vengono monitorate da un contesto.

  • Le operazioni su entità disconnesse sono molto più comuni nelle applicazioni a più livelli.

  • Le applicazioni a più livelli implicano il recupero di alcuni dati su un server e la restituzione, tramite la rete, a una macchina client.

  • L'applicazione client quindi manipola questi dati prima di restituirli al server per essere mantenuti.

Di seguito sono riportati i due passaggi che devono essere eseguiti con il grafico di entità disconnessa o anche con una singola entità disconnessa.

  • Collega le entità con la nuova istanza di contesto e rendi consapevole il contesto di queste entità.

  • Impostare manualmente gli EntityStates appropriati per queste entità.

Diamo un'occhiata al codice seguente in cui l'entità Student viene aggiunta con due entità 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();
      }
   } 
}
  • Il codice costruisce una nuova istanza di Student, che fa riferimento anche a due nuove istanze di Enrollment nella relativa proprietà Enrollments.

  • Quindi il nuovo Studente viene aggiunto a un contesto utilizzando il metodo Aggiungi.

  • Dopo aver aggiunto lo Student, il codice usa il metodo DbContext.Entry per ottenere l'accesso alle informazioni di rilevamento delle modifiche che Entity Framework ha sul nuovo Student.

  • Da queste informazioni sul rilevamento delle modifiche, la proprietà State viene utilizzata per scrivere lo stato corrente dell'entità.

  • Questo processo viene quindi ripetuto per ciascuna delle iscrizioni appena create a cui fa riferimento il nuovo Studente. Se esegui l'applicazione, riceverai il seguente output:

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

Mentre DbSet.Add viene usato per indicare a Entity Framework le nuove entità, DbSet.Attach viene usato per indicare a Entity Framework le entità esistenti. Il metodo Allega contrassegnerà un'entità nello stato Non modificato.

Diamo un'occhiata al codice C # seguente in cui un'entità disconnessa è collegata a 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();
      }
   }
}

Quando il codice sopra viene eseguito con il metodo Attach (), riceverai il seguente output.

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