Caricare automaticamente i dati delle relazioni in EF Core 6

di Stefano Mostarda, in LINQ, Entity Framework,

Una delle regole d'oro di EF Core è quella di non fare nulla che non sia stato esplicitato dallo sviluppatore. Un tipico caso in cui questa regola si applica è nelle query che recuperano un grafo di oggetti. Per fare un esempio, se vogliamo recuperare un ordine e i suoi dettagli, dobbiamo utilizzare il metodo Include per aggiungere i dettagli, altrimenti la query recupera solo l'ordine.

// recupera solo l'ordine
ctx.Orders.First(c => c.Id == 1);

// recupera ordine e dettagli
ctx.Orders.Include(c => c.Details).First(c => c.Id == 1);

Tuttavia, esistono casi in cui vogliamo che quando recuperiamo una determinata entity, vengano recuperate in automatico anche una o più entity collegate. Nel nostro caso, potremmo dover recuperare i dettagli ogni volta recuperiamo un ordine. Aggiungere una chiamata a Include in ogni query è si fattibile, ma estremamente complesso nella sua realizzazione e manutenzione.

Per semplificare questi scenari, EF Core 6 introduce un nuovo metodo disponibile in fase di configurazione dell'entity: AutoInclude. Questo metodo si applica a una proprietà di navigazione e specifica che questa deve essere recuperata ogni qualvolta l'entity principale viene letta.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Order>().Navigation(c => c.Details).AutoInclude();
}

Grazie a questa configurazione, la prossima query recupera sia l'ordine che i suoi dettagli.

// recupera l'ordine e i dettagli
ctx.Orders.First(c => c.Id == 1);

Se in determinate query vogliamo disabilitare il comportamento automatico, possiamo farlo usando l'extension method IgnoreAutoIncludes.

ctx.Order
  .IgnoreAutoIncludes()
  .First(c => c.Id);

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