Guida Completa a Entity Framework in ASP.NET

Guida Completa a Entity Framework in ASP.NET

Marco Puccio

Introduzione

Entity Framework (EF) è un Object-Relational Mapper (ORM) per .NET che permette di interagire con un database utilizzando entità (classi) invece di SQL grezzo. Questo consente di scrivere codice più pulito e manutenibile, delegando al framework la gestione delle query SQL. In questa guida completa, esploreremo ogni aspetto di Entity Framework, dalle basi fino alle ottimizzazioni avanzate e l'integrazione con Stored Procedure.


1️⃣ Creazione del Progetto e Configurazione di Entity Framework

Per iniziare, apri Visual Studio e crea un nuovo progetto:

  1. File → New → Project → ASP.NET Web Application (.NET Framework).

  2. Seleziona MVC e clicca su Create.

  3. Aggiungi il pacchetto NuGet per Entity Framework:

Install-Package EntityFramework
  1. Configura il file Web.config con la stringa di connessione:

<connectionStrings>
  <add name="DatabaseContext" connectionString="Server=localhost;Database=MyAppDB;Trusted_Connection=True;" providerName="System.Data.SqlClient" />
</connectionStrings>



2️⃣ Creazione del Modello di Dati

Con Entity Framework puoi generare il modello di dati usando Code FirstDatabase FirstModel First. Qui vedremo l'approccio Code First. Questo metodo consente di creare le entità direttamente nel codice e generare le tabelle nel database.

public class Utente
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public string Email { get; set; }
}

public class DatabaseContext : DbContext
{
    public DbSet<Utente> Utenti { get; set; }
}

Dopo aver definito il modello, puoi generare il database tramite migrazioni:

Enable-Migrations
Add-Migration InitialCreate
Update-Database

Le migrazioni permettono di aggiornare la struttura del database mantenendo i dati esistenti. Puoi aggiungere colonne, modificare tipi di dati e applicare modifiche in modo sicuro.



3️⃣ Operazioni CRUD (Create, Read, Update, Delete)

Con Entity Framework, le operazioni CRUD sono estremamente semplici e si integrano perfettamente con LINQ:

// CREATE
using (var context = new DatabaseContext())
{
    var utente = new Utente { Nome = "Marco", Email = "marco@example.com" };
    context.Utenti.Add(utente);
    context.SaveChanges();
}

// READ
using (var context = new DatabaseContext())
{
    var utenti = context.Utenti.ToList();
}

// UPDATE
using (var context = new DatabaseContext())
{
    var utente = context.Utenti.FirstOrDefault(u => u.Id == 1);
    utente.Nome = "Marco Puccio";
    context.SaveChanges();
}

// DELETE
using (var context = new DatabaseContext())
{
    var utente = context.Utenti.FirstOrDefault(u => u.Id == 1);
    context.Utenti.Remove(utente);
    context.SaveChanges();
}

Entity Framework tiene traccia dei cambiamenti tramite il Change Tracker, che consente di monitorare le modifiche agli oggetti prima di salvarli nel database.



4️⃣ Lazy Loading, Eager Loading e Explicit Loading

Entity Framework supporta tre modalità di caricamento dei dati correlati:

  • Lazy Loading: i dati vengono caricati solo quando effettivamente richiesti.

  • Eager Loading: i dati vengono caricati immediatamente tramite Include().

  • Explicit Loading: i dati vengono caricati su richiesta esplicita dell'utente.

// Lazy Loading
automobile.Modello.ToList();

// Eager Loading
var automobili = context.Automobili.Include(a => a.Modello).ToList();

// Explicit Loading
context.Entry(automobile).Collection(a => a.Modello).Load();

Scegliere il metodo di caricamento corretto migliora notevolmente le performance e riduce le query SQL generate.



5️⃣ Migrazioni Avanzate e Rollback

Le migrazioni avanzate permettono di evolvere il database nel tempo senza perdere dati. Possiamo:

  • Aggiungere colonne

  • Modificare tipi di dati

  • Rinominare tabelle

Esempio di rollback:

Update-Database -TargetMigration:"NomeMigrazione"

Esempio di migrazione:

public partial class AggiuntaColonnaIndirizzo : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Utenti", "Indirizzo", c => c.String(nullable: true));
    }

    public override void Down()
    {
        DropColumn("dbo.Utenti", "Indirizzo");
    }
}