Entity Framework - Types

Dans Entity Framework, il existe deux types d'entités qui permettent aux développeurs d'utiliser leurs propres classes de données personnalisées avec le modèle de données sans apporter de modifications aux classes de données elles-mêmes.

  • Entités POCO
  • Proxy dynamique

Entités POCO

  • POCO signifie objets CLR «simples» qui peuvent être utilisés comme objets de domaine existants avec votre modèle de données.

  • Les classes de données POCO qui sont mappées à des entités sont définies dans un modèle de données.

  • Il prend également en charge la plupart des mêmes comportements de requête, d'insertion, de mise à jour et de suppression que les types d'entité générés par les outils de modèle de données d'entité.

  • Vous pouvez utiliser le modèle POCO pour générer des types d'entités ignorant la persistance à partir d'un modèle conceptuel.

Jetons un coup d'œil à l'exemple suivant de modèle de données d'entité conceptuelle.

Pour générer des entités POCO pour le modèle d'entité ci-dessus -

Step 1- Faites un clic droit sur la fenêtre du concepteur. Il affichera la boîte de dialogue suivante.

Step 2 - Sélectionnez l'élément Ajouter une génération de code ...

Step 3 - Sélectionnez le générateur EF 6.x DbContext, écrivez le nom, puis cliquez sur le bouton Ajouter.

Vous verrez dans votre explorateur de solutions que les modèles POCODemo.Context.tt et POCODemo.tt sont générés.

Le POCODemo.Context génère le DbContext et les ensembles d'objets que vous pouvez retourner et utiliser pour interroger, par exemple pour le contexte, les étudiants et les cours, etc.

L'autre modèle traite de tous les types Étudiant, Cours, etc. Voici le code de la classe Étudiant qui est généré automatiquement à partir du modèle d'entité.

namespace ConsoleApplication1 {

   using System;
   using System.Collections.Generic;

   public partial class Student {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Student() {
         this.Enrollments = new HashSet<Enrollment>();
      }

      public int ID { get; set; }
      public string LastName { get; set; }
      public string FirstMidName { get; set; }
      public System.DateTime EnrollmentDate { get; set; }

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         CA2227:CollectionPropertiesShouldBeReadOnly")]

      public virtual ICollection<Enrollment> Enrollments { get; set; }

   }
}

Des classes similaires sont générées pour les tables de cours et d'inscription à partir du modèle d'entité.

Proxy dynamique

Lors de la création d'instances de types d'entité POCO, Entity Framework crée souvent des instances d'un type dérivé généré dynamiquement qui agit comme un proxy pour l'entité. On peut également dire qu'il s'agit d'une classe proxy d'exécution comme une classe wrapper d'entité POCO.

  • Vous pouvez remplacer certaines propriétés de l'entité pour effectuer automatiquement des actions lors de l'accès à la propriété.

  • Ce mécanisme est utilisé pour prendre en charge le chargement différé des relations et le suivi automatique des modifications.

  • Cette technique s'applique également aux modèles créés avec Code First et EF Designer.

Si vous souhaitez que Entity Framework prenne en charge le chargement différé des objets associés et effectue le suivi des modifications dans les classes POCO, les classes POCO doivent répondre aux exigences suivantes:

  • La classe de données personnalisée doit être déclarée avec un accès public.

  • La classe de données personnalisée ne doit pas être scellée.

  • La classe de données personnalisée ne doit pas être abstraite.

  • La classe de données personnalisée doit avoir un constructeur public ou protégé qui n'a pas de paramètres.

  • Utilisez un constructeur protégé sans paramètres si vous souhaitez que la méthode CreateObject soit utilisée pour créer un proxy pour l'entité POCO.

  • L'appel de la méthode CreateObject ne garantit pas la création du proxy: la classe POCO doit suivre les autres exigences décrites dans cette rubrique.

  • La classe ne peut pas implémenter les interfaces IEntityWithChangeTracker ou IEntityWithRelationships car les classes proxy implémentent ces interfaces.

  • L'option ProxyCreationEnabled doit être définie sur true.

L'exemple suivant est une classe d'entité proxy dynamique.

public partial class Course {

   public Course() {
      this.Enrollments = new HashSet<Enrollment>();
   }

   public int CourseID { get; set; }
   public string Title { get; set; }
   public int Credits { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

Pour désactiver la création d'objets proxy, définissez la valeur de la propriété ProxyCreationEnabled sur false.