Sin dalla prima versione di Entity Framework Core, abbiamo potuto mappare una gerarchia di classi utilizzando la modalità TPH (Table Per Hierarchy) dove una gerarchia viene mappata su una singola tabella. Questa modalità ha ovviamente i suoi vantaggi e i suoi svantaggi. L'ovvio vantaggio è quello di avere ottime performance, mentre lo svantaggio più grande è quello di avere un modello del database molto sporco. Per ovviare a questo problema con Entity Framework 5 è stata introdotta una nuova modalità di mapping di una gerarchia di classi: il TPT (Table Per Type).
In questa modalità, viene creata una tabella per ogni classe della gerarchia (una per la classe base e una per ogni classe figlia) e queste tabelle sono collegate tramite la primary key della tabella che mappa la classe base. L'ovvio vantaggio di questa modalità è quello di avere un modello di database molto più pulito rispetto al TPH, ma per contro per ogni query è richiesta la join tra le tabelle con conseguente sacrificio delle performance quando le join diventano tante.
Per mappare la gerarchia usando il modello TPT dobbiamo usare il metodo ToTable in fase di mapping delle classi come mostrato nel prossimo esempio.
public abstract class Worker
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Employee : Worker
{
public decimal Salary { get; set; }
}
public class Manager : Worker
{
public int ManagedEmployees { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Worker> Workers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Worker>().ToTable("Workers");
modelBuilder.Entity<Employee>().ToTable("Employees");
modelBuilder.Entity<Manager>().ToTable("Managers");
}
}
Il metodo ToTable prende in input il nome della tabella collegata a ogni classe. Se omettiamo il nome, nel caso della tabella base viene usato il nome del DbSet mentre per le altre classi della gerarchia viene usato il nome della classe.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Utilizzare una qualunque lista per i parametri di tipo params in C#
Aggiornare a .NET 9 su Azure App Service
Loggare le query più lente con Entity Framework
Creare una libreria CSS universale: Clip-path
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Eliminare una project wiki di Azure DevOps
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Utilizzare Locust con Azure Load Testing
Configurare lo startup di applicazioni server e client con .NET Aspire
Utilizzare Azure AI Studio per testare i modelli AI
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!