Mappare l'ereditarietà di una gerarchia di oggetti usando il TPT in Entity Framework Core 5

di Stefano Mostarda, in LINQ, Entity Framework,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi