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
Creazione di componenti personalizzati in React.js con Tailwind CSS
Utilizzare i primary constructor in C#
Eseguire le GitHub Actions offline
Creare gruppi di client per Event Grid MQTT
Utilizzare politiche di resiliency con Azure Container App
Potenziare Azure AI Search con la ricerca vettoriale
Cambiare la chiave di partizionamento di Azure Cosmos DB
Reactive form tipizzati con FormBuilder in Angular
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Migrare una service connection a workload identity federation in Azure DevOps
Eseguire una GroupBy per entity in Entity Framework