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
Creare velocemente microservice grazie a minimal API di ASP.NET Core 6
Utilizzare la visualizzazione flex per spostare una sidebar in base alle dimensioni dello schermo
Produttività con ASP.NET Core 6
Un confronto tra Framework CSS: Foundation, Bulma, TailwindCSS e SemanticUI
Scrivere CSS Media Query utilizzando una range syntax
Usare domini personalizzati con Azure Container App
Migrare da Azure DevOps a GitHub
Autenticazione basata su certificati con ASP.NET Core
Configuration strongly typed anche per singleton con IOptionsMonitor in ASP.NET Core
Bypassare l'esecuzione di una GitHub Action su branch protetti
GitHub e .NET 6
Caricare automaticamente i dati delle relazioni in EF Core 6