Entity Framework - Suivi des modifications

Entity Framework permet de suivre les modifications apportées aux entités et à leurs relations, de sorte que les mises à jour correctes sont effectuées sur la base de données lorsque la méthode SaveChanges de contexte est appelée. Il s'agit d'une fonctionnalité clé d'Entity Framework.

  • Le suivi des modifications suit les modifications tout en ajoutant de nouveaux enregistrements à la collection d'entités, en modifiant ou en supprimant des entités existantes.

  • Ensuite, toutes les modifications sont conservées par le niveau DbContext.

  • Ces modifications de suivi sont perdues si elles ne sont pas enregistrées avant la destruction de l'objet DbContext.

  • La classe DbChangeTracker vous donne toutes les informations sur les entités actuelles suivies par le contexte.

  • Pour suivre une entité par le contexte, elle doit avoir la propriété de clé primaire.

Dans Entity Framework, le suivi des modifications est activé par défaut. Vous pouvez également désactiver le suivi des modifications en définissant la propriété AutoDetectChangesEnabled de DbContext sur false. Si cette propriété est définie sur true, Entity Framework conserve l'état des entités.

using (var context = new UniContextEntities()) {
   context.Configuration.AutoDetectChangesEnabled = true;
}

Jetons un coup d'œil à l'exemple suivant dans lequel les étudiants et leurs inscriptions sont extraits de la base de données.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Configuration.AutoDetectChangesEnabled = true;
         Console.WriteLine("Retrieve Student");

         var student = (from s in context.Students where s.FirstMidName == 
            "Ali" select s).FirstOrDefault<Student>();

         string name = student.FirstMidName + " " + student.LastName;
         Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
         Console.WriteLine();
         Console.WriteLine("Retrieve all related enrollments");

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

         Console.WriteLine();

         Console.WriteLine("Context tracking changes of {0} entity.", 
            context.ChangeTracker.Entries().Count());

         var entries = context.ChangeTracker.Entries();

         foreach (var entry in entries) {
            Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().Name);
            Console.WriteLine("Status: {0}", entry.State);
         }

         Console.ReadKey();
      }
   }
}

Lorsque l'exemple ci-dessus est compilé et exécuté, vous recevrez la sortie suivante.

Retrieve Student 
ID: 1, Name: Ali Alexander
Retrieve all related enrollments
       Enrollment ID: 1, Course ID: 1050
       Enrollment ID: 2, Course ID: 4022
       Enrollment ID: 3, Course ID: 4041
Context tracking changes of 4 entity.
Entity Name: Student
Status: Unchanged
Entity Name: Enrollment
Status: Unchanged
Entity Name: Enrollment
Status: Unchanged
Entity Name: Enrollment
Status: Unchanged

Vous pouvez voir que toutes les données sont uniquement extraites de la base de données, c'est pourquoi le statut est inchangé pour toutes les entités.

Jetons maintenant un coup d'œil à un autre exemple simple dans lequel nous ajouterons une inscription supplémentaire et supprimerons un étudiant de la base de données. Voici le code dans lequel une nouvelle inscription est ajoutée et un étudiant est supprimé.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Configuration.AutoDetectChangesEnabled = true;

         Enrollment enr = new Enrollment() { 
            StudentID = 1, CourseID = 3141 
         };

         Console.WriteLine("Adding New Enrollment");
         context.Enrollments.Add(enr);
         Console.WriteLine("Delete Student");

         var student = (from s in context.Students where s.ID == 
            23 select s).SingleOrDefault<Student>();

         context.Students.Remove(student);
         Console.WriteLine("");

         Console.WriteLine("Context tracking changes of {0} entity.", 
            context.ChangeTracker.Entries().Count());
         var entries = context.ChangeTracker.Entries();

         foreach (var entry in entries) {
            Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().Name);
            Console.WriteLine("Status: {0}", entry.State);
         }

         Console.ReadKey();
      }
   }
}

Lorsque l'exemple ci-dessus est compilé et exécuté, vous recevrez la sortie suivante.

Adding New Enrollment
Delete Student
Context tracking changes of 2 entity.
Entity Name: Enrollment
Status: Added
Entity Name: Student
Status: Deleted

Vous pouvez maintenant voir que le statut de l'entité d'inscription est défini sur ajouté et que le statut de l'entité étudiant est supprimé, car une nouvelle inscription a été ajoutée et un étudiant est supprimé de la base de données.

Nous vous recommandons d'exécuter l'exemple ci-dessus étape par étape pour une meilleure compréhension.