Entity Framework - Tipi

In Entity Framework, esistono due tipi di entità che consentono agli sviluppatori di utilizzare le proprie classi di dati personalizzate insieme al modello di dati senza apportare modifiche alle classi di dati stesse.

  • Entità POCO
  • Proxy dinamico

Entità POCO

  • POCO sta per oggetti CLR "semplici" che possono essere utilizzati come oggetti di dominio esistenti con il modello di dati.

  • Le classi di dati POCO che sono mappate alle entità sono definite in un modello di dati.

  • Supporta anche la maggior parte degli stessi comportamenti di query, inserimento, aggiornamento ed eliminazione dei tipi di entità generati dagli strumenti Entity Data Model.

  • È possibile utilizzare il modello POCO per generare tipi di entità che ignorano la persistenza da un modello concettuale.

Diamo un'occhiata al seguente esempio di Conceptual Entity Data Model.

Per generare entità POCO per il modello di entità precedente:

Step 1- Fare clic con il tasto destro sulla finestra del designer. Verrà visualizzata la seguente finestra di dialogo.

Step 2 - Seleziona Aggiungi elemento generazione codice ...

Step 3 - Seleziona EF 6.x DbContext Generator, scrivi il nome e fai clic sul pulsante Aggiungi.

Vedrai in Esplora soluzioni che vengono generati i modelli POCODemo.Context.tt e POCODemo.tt.

Il POCODemo.Context genera il DbContext e gli insiemi di oggetti che puoi restituire e utilizzare per le query, ad esempio per il contesto, Studenti e Corsi, ecc.

L'altro modello si occupa di tutti i tipi Studente, Corsi, ecc. Di seguito è riportato il codice per la classe Studente che viene generato automaticamente dal Modello di 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; }

   }
}

Classi simili vengono generate per le tabelle di corso e di iscrizione dal modello di entità.

Proxy dinamico

Quando si creano istanze di tipi di entità POCO, Entity Framework crea spesso istanze di un tipo derivato generato dinamicamente che funge da proxy per l'entità. Si può anche dire che si tratta di classi proxy di runtime come una classe wrapper dell'entità POCO.

  • È possibile sovrascrivere alcune proprietà dell'entità per eseguire azioni automaticamente quando si accede alla proprietà.

  • Questo meccanismo viene utilizzato per supportare il caricamento lento delle relazioni e il rilevamento automatico delle modifiche.

  • Questa tecnica si applica anche a quei modelli creati con Code First e EF Designer.

Se si desidera che Entity Framework supporti il ​​caricamento lento degli oggetti correlati e tenga traccia delle modifiche nelle classi POCO, le classi POCO devono soddisfare i seguenti requisiti:

  • La classe di dati personalizzata deve essere dichiarata con accesso pubblico.

  • La classe di dati personalizzata non deve essere sigillata.

  • La classe di dati personalizzata non deve essere astratta.

  • La classe di dati personalizzata deve avere un costruttore pubblico o protetto che non dispone di parametri.

  • Utilizzare un costruttore protetto senza parametri se si desidera utilizzare il metodo CreateObject per creare un proxy per l'entità POCO.

  • La chiamata al metodo CreateObject non garantisce la creazione del proxy: la classe POCO deve seguire gli altri requisiti descritti in questo argomento.

  • La classe non può implementare le interfacce IEntityWithChangeTracker o IEntityWithRelationships perché le classi proxy implementano queste interfacce.

  • L'opzione ProxyCreationEnabled deve essere impostata su true.

Il seguente esempio è di una classe entità proxy dinamico.

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; }
}

Per disabilitare la creazione di oggetti proxy, impostare il valore della proprietà ProxyCreationEnabled su false.