Entity Framework 4.1 Proprietà virtuali

Se ho dichiarato la relazione dell’ quadro nel mio modello come virtuale, non c’è bisogno di usare l’istruzione Include nella mia query LINQ, giusto ??

Per esempio: questa è la mia class di modello:

 public class Brand { public int BrandID { get; set; } public string BrandName { get; set; } public string BrandDesc { get; set; } public string BrandUrl { get; set; } public virtual ICollection Products { get; set; } } 

Ora, per la suddetta class di modello, non ho bisogno di usare i var brandsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22); .

Invece, posso semplicemente usare il semplice var brandsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22); e avrò automaticamente l’ quadro correlata disponibile quando si accede.

Ho ragione nella mia comprensione?

Inoltre, per favore dimmi in quali situazioni preferirei uno rispetto all’altro ??

Sei corretto ma la regola è più complessa per farlo funzionare davvero come previsto. Se si definisce la proprietà di navigazione, virtual EF virtual a runtime creerà una nuova class (proxy dinamico) derivata dalla class Brand e la utilizzerà invece. Questa nuova class creata dynamicmente contiene la logica per caricare la proprietà di navigazione quando si accede per la prima volta. Questa funzione è chiamata caricamento lento (o caricamento pigro trasparente migliore).

Quali regole devono essere soddisfatte per fare in modo che funzioni:

  • Tutte le proprietà di navigazione in class devono essere virtual
  • La creazione del proxy dinamico non deve essere disabilitata ( context.Configuration.ProxyCreationEnabled ). Si è abilitata di default.
  • Il caricamento lento non deve essere disabilitato ( context.Configuration.LazyLoadingEnabled ). Si è abilitata di default.
  • L’entity framework deve essere allegata (impostazione predefinita se si carica l’entity framework dal database) al contesto e il contesto non deve essere eliminato = il caricamento lazy funziona solo nell’ambito del contesto di vita utilizzato per caricarlo dal database (o in cui è stata allegata l’ quadro proxy)

L’opposto del caricamento lento è chiamato caricamento impaziente e questo è ciò che Include . Se si utilizza Include la proprietà di navigazione viene caricata insieme all’entity framework principale.

L’utilizzo del caricamento lento e del caricamento impaziente dipende dalle tue esigenze e anche dalle prestazioni. Include carica tutti i dati nella query di un singolo database, ma può comportare un enorme set di dati quando si utilizzano molti contenuti o si caricano molte quadro. Se sei sicuro di aver bisogno del Brand e di tutti i Products per l’elaborazione, dovresti utilizzare il caricamento entusiasmante.

Il carico pigro viene utilizzato a sua volta se non si è certi della proprietà di navigazione di cui si avrà bisogno. Ad esempio, se carichi 100 marchi, ma dovrai accedere solo ai prodotti di una marca, non è necessario caricare i prodotti per tutte le marche nella query iniziale. Lo svantaggio del caricamento lazy è una query separata (roundtrip del database) per ogni proprietà di navigazione => se carichi 100 marche senza includere e accederai alla proprietà Products in ogni istanza di Brand tuo codice genererà altre 100 query per popolare queste proprietà di navigazione = desideroso il caricamento usava solo la query singe ma il caricamento lazy utilizzava 101 query (si chiama N + 1 problema).

In scenari più complessi, è ansible scoprire che nessuna di queste strategie funziona come necessario e che è ansible utilizzare una terza strategia chiamata caricamento esplicito o query separate per caricare marchi e prodotti per tutti i marchi necessari.

Il caricamento esplicito presenta svantaggi analoghi a quelli del caricamento lazy, ma è necessario triggersrlo manualmente:

 context.Entry(brand).Collection(b => b.Products).Load(); 

I principali vantaggi del caricamento esplicito sono la capacità di filtrare la relazione. È ansible utilizzare Query() prima di Load() e utilizzare qualsiasi filtraggio o persino il caricamento avido di relazioni nidificate.