2012-10-22 24 views
6

Ho letto here che durante l'interrogazione dei dati per un'operazione di lettura, l'impostazione di ObjectTrackingEnabled su false offre un miglioramento delle prestazioni. Le mie query simile a questa:ObjectTrackingEnabled e linq-to-sql

public return type TheQueryName (some parameters) 
{ 
    using (TheDC MyDC = new TheDC()) 
    { 
     var TheQuery = (...).ToList(); 

     return TheQuery; 
    } 
} 

1) Se voglio aggiungere il miglioramento delle prestazioni, posso solo aggiungere la riga ObjectTrackingEnabled = true; appena prima della riga var TheQuery = (...).ToList();

2) Inoltre, se io impostare ObjectTrackingEnabled a true in una query, è necessario impostarlo su false prima di tornare o sto semplicemente impostando ObjectTrackingEnabled per la particolare istanza del contesto dati e la volta successiva creerò un nuovo contesto di dati il ​​valore di ObjectTrackingEnabled verrà ripristinato indietro t o il suo stato predefinito di false?

Nota: ho solo intenzione di aggiungere ObjectTrackingEnabled = false; per leggere le operazioni.

Grazie.

+0

Questo è un altro post del blog utili su come le cose possono impazzire fuori controllo se si sta inutilmente il monitoraggio cose: https://weblog.west-wind.com/posts/2014/dec/21/gotcha -entity-framework-gets-slow-in-long-iteration-loop –

risposta

8

ObjectTrackingEnabled controlla se il tuo Data Context (TheDC nel tuo caso) tiene traccia delle modifiche alle entità dopo che sono state caricate. Che tu lo voglia o meno dipende dal tuo caso specifico.

Naturalmente, avere il contesto di dati fa meno cose lo farà andare più veloce, ma a spese del peso si con le modifiche di monitoraggio. Perché il rilevamento del cambiamento è interessante? Perché è possibile:

  1. Caricare fino alcune entità da qualche contesto
  2. Modificare loro
  3. aggiungerne di nuovi, eliminare altri
  4. chiamata SaveChanges e lasciare che la figura contesto dati fuori a fare le query di aggiornamento per le entità modificate , DELETE per quelli cancellati, ecc

Con il rilevamento delle modifiche disattivato, si deve dire al contesto esplicitamente cosa è cambiato, quali sono i nuovi valori sono, ecc

Supponendo che non si desideri il tracciamento dell'oggetto, la proprietà viene impostata su ogni istanza di contesto dati specifica. Questo significa che si deve a uno:

  1. impostarlo manualmente per ogni contesto dati si crea
  2. impostarlo come predefinito per il contesto nel costruttore del contesto in questo modo: this.Configuration.AutoDetectChangesEnabled = true; Vedere this blog post per i dettagli

Spero che questo aiuti!

+0

Giusto per essere chiari, ho intenzione di impostare ObjectTrackingEnabled su false per le operazioni di lettura. E per quanto riguarda la sintassi, puoi vedere la domanda al punto 1)? – frenchie

+0

Per quanto riguarda dove disabilitare il rilevamento delle modifiche, lo farei non appena creerò il contesto. Quindi, nel tuo caso, prima della query, subito dopo l'istruzione 'using' –

0

I tag e la riga dell'oggetto dicono "Linq2SQL" ma la tua domanda riguarda Entity Framwork.

Per 'tradizionale' Linq2SQL avete bisogno di questo, invece:

linq2SqlDBContext.ObjectTrackingEnabled = false; 
+1

Simon_Weaver, AFAIK" DataContext "è il termine corretto in L2S; EF ha iniziato con "ObjectContext", quindi aggiunto e spostato in "DbContext". Inoltre, L2S offre ObjectTrackingEnabled; vedere, ad esempio: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/how-to-retrieve-information-as-read-only – pakx

+0

Questo è quello che ottengo per l'utilizzo 3 diverse generazioni di MS "datacontext" contemporaneamente: - / –

1

In riferimento a:

1) Se voglio aggiungere il miglioramento delle prestazioni, posso solo aggiungere la riga ObjectTrackingEnabled = true; just before the line var TheQuery = (...).ToList();

Il miglioramento delle prestazioni delle query deriva dal rilevamento NON. Quindi si desidera disabilitare questa funzione nelle query READ, subito dopo la creazione del nuovo datacontext per questo scopo.

ObjectTrackingEnabled = FALSE 
Problemi correlati