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
Sostituire la GitHub Action di login su private registry
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Ordine e importanza per @layer in CSS
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Limitare le richieste lato server con l'interactive routing di Blazor 8
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Migliorare la sicurezza dei prompt con Azure AI Studio
C# 12: Cosa c'è di nuovo e interessante
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Usare lo spread operator con i collection initializer in C#
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core