Entity Framework - Entités déconnectées

Dans ce chapitre, voyons comment apporter des modifications aux entités qui ne sont pas suivies par un contexte. Les entités qui ne sont pas suivies par un contexte sont appelées entités «déconnectées».

  • Pour la plupart des applications à un seul niveau, où l'interface utilisateur et les couches d'accès à la base de données s'exécutent dans le même processus d'application, vous n'effectuerez probablement que des opérations sur des entités suivies par un contexte.

  • Les opérations sur des entités déconnectées sont beaucoup plus courantes dans les applications N-Tier.

  • Les applications N-Tier impliquent de récupérer certaines données sur un serveur et de les renvoyer, via le réseau, à une machine cliente.

  • L'application cliente manipule ensuite ces données avant de les renvoyer au serveur pour qu'elles soient persistantes.

Voici les deux étapes à suivre avec le graphe d'entités déconnectées ou même une seule entité déconnectée.

  • Attachez des entités à la nouvelle instance de contexte et rendez compte du contexte sur ces entités.

  • Définissez manuellement les EntityStates appropriés sur ces entités.

Jetons un coup d'œil au code suivant dans lequel l'entité Student est ajoutée avec deux entités 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();
      }
   } 
}
  • Le code construit une nouvelle instance Student, qui fait également référence à deux nouvelles instances Enrollment dans sa propriété Enrollments.

  • Ensuite, le nouvel étudiant est ajouté à un contexte à l'aide de la méthode Add.

  • Une fois l'étudiant ajouté, le code utilise la méthode DbContext.Entry pour accéder aux informations de suivi des modifications dont Entity Framework dispose sur le nouvel étudiant.

  • À partir de ces informations de suivi des modifications, la propriété State est utilisée pour écrire l'état actuel de l'entité.

  • Ce processus est ensuite répété pour chacune des inscriptions nouvellement créées qui sont référencées par le nouvel étudiant. Si vous exécutez l'application, vous recevrez la sortie suivante -

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

Alors que DbSet.Add est utilisé pour indiquer à Entity Framework les nouvelles entités, DbSet.Attach est utilisé pour indiquer à Entity Framework les entités existantes. La méthode Attach marquera une entité dans l'état Inchangé.

Jetons un coup d'œil au code C # suivant dans lequel une entité déconnectée est attachée avec 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();
      }
   }
}

Lorsque le code ci-dessus est exécuté avec la méthode Attach (), vous recevrez la sortie suivante.

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