Entity Framework - DbContext

Entity Framework consente di eseguire query, inserire, aggiornare ed eliminare dati, utilizzando oggetti Common Language Runtime (CLR) noti come entità. Entity Framework mappa le entità e le relazioni definite nel modello in un database. Fornisce inoltre servizi per:

  • Materializza i dati restituiti dal database come oggetti entità
  • Tenere traccia delle modifiche apportate agli oggetti
  • Gestisci la concorrenza
  • Propaga le modifiche degli oggetti al database
  • Associa oggetti ai controlli

La classe principale responsabile dell'interazione con i dati come oggetti è System.Data.Entity.DbContext. L'API DbContext non viene rilasciata come parte di .NET Framework. Per essere più flessibile e frequente con il rilascio di nuove funzionalità a Code First e all'API DbContext, il team di Entity Framework distribuisce EntityFramework.dll tramite la funzionalità di distribuzione NuGet di Microsoft.

  • NuGet ti consente di aggiungere riferimenti ai tuoi progetti .NET estraendo le DLL pertinenti direttamente nel tuo progetto dal Web.

  • Un'estensione di Visual Studio denominata Library Package Manager fornisce un modo semplice per estrarre l'assembly appropriato dal Web nei progetti.

  • L'API DbContext è principalmente mirata a semplificare l'interazione con Entity Framework.

  • Riduce inoltre il numero di metodi e proprietà necessari per accedere alle attività di uso comune.

  • Nelle versioni precedenti di Entity Framework, queste attività erano spesso complicate da individuare e codificare.

  • La classe di contesto gestisce gli oggetti entità durante il runtime, che include il popolamento di oggetti con i dati di un database, il rilevamento delle modifiche e la persistenza dei dati nel database.

Definizione di una classe derivata da DbContext

Il modo consigliato per lavorare con il contesto è definire una classe che deriva da DbContext ed espone le proprietà DbSet che rappresentano le raccolte delle entità specificate nel contesto. Se stai lavorando con EF Designer, il contesto verrà generato per te. Se lavori con Code First, in genere scrivi tu stesso il contesto.

Il codice seguente è un semplice esempio che mostra che UniContext è derivato da DbContext.

  • È possibile utilizzare proprietà automatiche con DbSet come getter e setter.

  • Rende anche un codice molto più pulito, ma non è necessario utilizzarlo allo scopo di creare un DbSet quando non si ha altra logica da applicare.

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • In precedenza, EDM veniva utilizzato per generare classi di contesto derivate dalla classe ObjectContext.

  • Lavorare con ObjectContext era un po 'complesso.

  • DbContext è un wrapper per ObjectContext che in realtà è simile a ObjectContext ed è utile e facile in tutti i modelli di sviluppo come Code First, Model First e Database First.

Interrogazioni

Esistono tre tipi di query che puoi utilizzare, ad esempio:

  • Aggiunta di una nuova entità.
  • Modifica o aggiornamento dei valori delle proprietà di un'entità esistente.
  • Eliminazione di un'entità esistente.

Aggiunta di nuove entità

Aggiungere un nuovo oggetto con Entity Framework è semplice come costruire una nuova istanza del tuo oggetto e registrarlo utilizzando il metodo Add su DbSet. Il codice seguente serve per aggiungere un nuovo studente al database.

private static void AddStudent() {

   using (var context = new UniContext()) {

      var student = new Student {
         LastName = "Khan", 
         FirstMidName = "Ali", 
         EnrollmentDate = DateTime.Parse("2005-09-01") 
      };

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

   }
}

Modifica delle entità esistenti

Modificare gli oggetti esistenti è semplice come aggiornare il valore assegnato alla proprietà che si desidera modificare e chiamare SaveChanges. Nel codice seguente, il cognome di Ali è stato cambiato da Khan ad Aslam.

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

Eliminazione di entità esistenti

Per eliminare un'entità utilizzando Entity Framework, usa il metodo Remove su DbSet. Rimuovi opere sia per le entità esistenti che per quelle appena aggiunte. La chiamata di Rimuovi su un'entità che è stata aggiunta ma non ancora salvata nel database annullerà l'aggiunta dell'entità. L'entità viene rimossa dal rilevamento delle modifiche e non viene più rilevata da DbContext. La chiamata a Remove su un'entità esistente di cui si tiene traccia delle modifiche registrerà l'entità per l'eliminazione la prossima volta che viene chiamato SaveChanges. L'esempio seguente mostra un'istanza in cui lo studente viene rimosso dal database il cui nome è Ali.

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}