Entity Framework - Persistance

Entity Framework vous permet désormais de bénéficier d'Entity Framework sans forcer chaque partie de votre application à être consciente d'Entity Framework, séparant les entités de l'infrastructure. Vous pouvez créer des classes qui peuvent se concentrer sur leurs règles métier sans tenir compte de la façon dont elles sont persistantes (où les données sont stockées et comment les données vont et viennent entre vos objets).

Création d'entités ignorantes persistantes

Le paragraphe précédent décrit une méthode qui n'a aucune connaissance intime de la source des données qu'elle consomme. Cela met en évidence l'essence de l'ignorance de la persistance, c'est-à-dire lorsque vos classes et beaucoup de nos couches d'application autour d'elles ne se soucient pas de la façon dont les données sont stockées.

  • Dans la version .NET 3.5 d'Entity Framework, si vous vouliez utiliser des classes préexistantes, vous deviez les modifier en les forçant à dériver d'EntityObject.

  • Dans .NET 4, ce n'est plus nécessaire. Vous n'avez pas à modifier vos entités pour qu'elles participent aux opérations Entity Framework.

  • Cela nous permet de créer des applications qui englobent le couplage lâche et la séparation des préoccupations.

  • Avec ces modèles de codage, vos classes ne sont concernées que par leurs propres tâches et, de nombreuses couches de votre application, y compris l'interface utilisateur, n'ont aucune dépendance à la logique externe, comme les API Entity Framework, mais ces API externes sont capables d'interagir avec notre entités.

Il existe 2 façons (connectée et déconnectée) de conserver une entité avec Entity Framework. Les deux voies ont leur propre importance. Dans le cas d'un scénario connecté, les changements sont suivis par le contexte, mais dans le cas d'un scénario déconnecté, nous devons informer le contexte sur l'état de l'entité.

Scénarios connectés

Le scénario connecté est lorsqu'une entité est extraite de la base de données et modifiée dans le même contexte. Pour un scénario connecté, supposons que nous ayons un service Windows et que nous effectuions des opérations commerciales avec cette entité afin d'ouvrir le contexte, de parcourir toutes les entités, de faire nos opérations commerciales, puis d'enregistrer les modifications dans le même contexte que nous ouvert au début.

Jetons un coup d'œil à l'exemple suivant dans lequel les étudiants sont extraits de la base de données et mettent à jour le prénom des étudiants, puis enregistrent les modifications dans la base de données.

class Program {

   static void Main(string[] args) {

      using (var context = new MyContext()) {

         var studentList = context.Students.ToList();

         foreach (var stdnt in studentList) {
            stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
         }

         context.SaveChanges();

         //// Display all Students from the database

         var students = (from s in context.Students
            orderby s.FirstMidName select s).ToList<Student>();

         Console.WriteLine("Retrieve all Students from the database:");

         foreach (var stdnt in students) {
            string name = stdnt.FirstMidName + " " + stdnt.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
         }

         Console.ReadKey();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, vous recevrez la sortie suivante et vous verrez que le mot édité est attaché avant le prénom, comme indiqué dans la sortie suivante.

Retrieve all Students from the database: 
ID: 1, Name: Edited Edited Alain Bomer 
ID: 2, Name: Edited Edited Mark Upston

Scénarios déconnectés

Le scénario déconnecté se produit lorsqu'une entité est extraite de la base de données et modifiée dans un contexte différent. Supposons que nous voulions afficher des données dans une couche de présentation et que nous utilisions une application à n niveaux, il serait donc préférable d'ouvrir le contexte, de récupérer les données et enfin de fermer le contexte. Puisque ici nous avons récupéré les données et fermé le contexte, les entités que nous avons récupérées ne sont plus suivies et c'est le scénario déconnecté.

Jetons un coup d'œil au code suivant dans lequel une nouvelle entité Student déconnectée est ajoutée à un contexte à l'aide de la méthode Add.

class Program {

   static void Main(string[] args) {

      var student = new Student {
         ID = 1001, 
         FirstMidName = "Wasim", 
         LastName = "Akram", 
         EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
      };

      using (var context = new MyContext()) {

         context.Students.Add(student);
         context.SaveChanges();

         //// Display all Students from the database

         var students = (from s in context.Students 
            orderby s.FirstMidName select s).ToList<Student>();

         Console.WriteLine("Retrieve all Students from the database:");

         foreach (var stdnt in students) {
            string name = stdnt.FirstMidName + " " + stdnt.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
         }

         Console.ReadKey();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, vous recevrez la sortie suivante.

Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram