Quando usare Includi in EF? Non necessario in proiezione?

entity-framework entity-framework-core

Domanda

Ho il seguente in Entity Framework Core:

public class Book {
  public Int32 Id { get; set; }
  public String Title { get; set; }
  public virtual Theme Theme { get; set; }
}

public class Theme {
  public Int32 Id { get; set; }
  public String Name { get; set; }
  public Byte[] Illustration { get; set; }
  public virtual ICollection<Ebook> Ebooks { get; set; }
}

E ho la seguente query linq:

List<BookModel> books = await context.Books.Select(x =>
  new BookModel {
    Id = x.Id,
    Name = x.Name,
    Theme = new ThemeModel {
      Id = x.Theme.Id,
      Name = x.Theme.Name
    }
   }).ToListAsync();

Non avevo bisogno di includere il tema per farlo funzionare, ad esempio:

List<BookModel> books = await context.Books.Include(x => x.Theme).Select(x => ...

Quando sarà necessario utilizzare Includi in Entity Framework?

AGGIORNARE

Ho aggiunto una colonna di tipo Byte [] Illustrazione in tema. Nella mia proiezione non includo quella colonna quindi verrà caricata se utilizzo Include? O non viene mai caricato a meno che non lo abbia nella proiezione?

Risposta accettata

Non hai bisogno di Includi perché lavoravi all'interno del contesto EF. Quando si fa riferimento a Temi nell'oggetto anonimo che si sta creando, che non sta utilizzando il caricamento lazy, ciò indica a EF di fare un join.

Se restituisci un elenco di libri e non includi i temi, quando tenti di ottenere il tema noterai che è nullo. Se la connessione EF è aperta e il caricamento è lazy, andrà al DB e lo prenderà per te. Ma, se la connessione non viene aperta, devi ottenerla esplicitamente.

D'altra parte, se usi Includi, ottieni subito i dati. Sotto il cofano farà un JOIN al tavolo necessario e otterrà i dati proprio lì.

Puoi controllare la query SQL che EF sta generando per te e questo renderà le cose più chiare per te. Vedrai solo una query SQL.


Risposta popolare

Se si Include un figlio, viene caricato come parte della query originale, che lo rende più grande.

Se non si Include o si fa riferimento al bambino in qualche altro modo nella query, il set di risultati iniziale è più piccolo, ma ogni figlio che si riferisce successivamente caricherà pigro attraverso una nuova richiesta al database.

Se esegui il ciclo di 1000 utenti in una richiesta e richiedi le loro 10 foto ciascuna, effettuerai 1001 richieste di database se non Include il figlio ...

Inoltre, il caricamento lento richiede che il contesto non sia stato eliminato. Sempre una spiacevole sorpresa quando si passa un'entità a una vista per il rendering dell'interfaccia utente, ad esempio.

aggiornamento Prova questo ad esempio e vederlo fallire:

var book = await context.Books.First();
var theme = book.Theme;

Quindi prova questo:

var book = await context.Books.Include(b => b.Theme).First();
var theme = book.Theme;


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow