Che differenza fa .AsNoTracking ()?

Ho una domanda riguardante l’estensione .AsNoTracking() , poiché è tutto abbastanza nuovo e abbastanza confuso.

Sto usando un contesto per richiesta per un sito web.

Molte delle mie quadro non cambiano, quindi non ho bisogno di essere rintracciate, ma ho il seguente scenario in cui non sono sicuro di cosa sta andando nel database, o anche se in questo caso faccia la differenza.

Questo esempio è ciò che sto facendo attualmente:

 context.Set().AsNoTracking() // Step 1) Get user context.Set() // Step 2) Update user 

È lo stesso di sopra ma rimuove il .AsNoTracking() dal Passaggio 1:

 context.Set(); // Step 1) Get user context.Set() // Step 2) Update user 

I passaggi 1 e 2 utilizzano lo stesso contesto ma si verificano in momentjs diversi. Quello che non riesco a capire è se c’è qualche differenza. Poiché il passaggio 2 è un aggiornamento, suppongo che entrambi colpiranno comunque il database due volte.

Qualcuno può dirmi qual è la differenza?

    La differenza è che nel primo caso l’utente recuperato non viene tracciato dal contesto, quindi quando si intende salvare l’utente nel database, è necessario collegarlo e impostare correttamente lo stato dell’utente in modo che EF sappia che deve aggiornare l’utente esistente invece di inserirne uno nuovo. Nel secondo caso non è necessario farlo se si carica e si salva l’utente con la stessa istanza di contesto perché il meccanismo di tracciamento gestisce quello per te.

    vedi questa pagina Entity Framework e AsNoTracking

    Cosa fa AsNoTracking

    Entity Framework espone una serie di opzioni di ottimizzazione delle prestazioni per aiutarti a ottimizzare le prestazioni delle tue applicazioni. Una di queste opzioni di ottimizzazione è .AsNoTracking() . Questa ottimizzazione consente di indicare a Entity Framework non tracciare i risultati di una query. Ciò significa che Entity Framework non esegue alcuna elaborazione o archiviazione aggiuntiva delle entity framework restituite dalla query. Tuttavia, significa anche che non è ansible aggiornare queste quadro senza ricollegarle al grafico di tracciamento.

    ci sono significativi guadagni in termini di prestazioni usando AsNoTracking

    Nessuna ricerca LINQ su query di entity framework

    L’utilizzo di NoTracking () è consigliato quando la query è destinata alle operazioni di lettura. In questi scenari, recuperi le tue quadro ma non vengono tracciate dal tuo contesto. Ciò garantisce un utilizzo minimo della memoria e prestazioni ottimali

    Professionisti

    1. Prestazioni migliorate rispetto alle query LINQ regolari.
    2. Oggetti completamente materializzati
    3. È più semplice scrivere con la syntax integrata nel linguaggio di programmazione.

    Contro

    1. Non adatto per le operazioni CUD.
    2. Alcune limitazioni tecniche, quali: I modelli che utilizzano DefaultIfEmpty per le query OUTER JOIN generano query più complesse rispetto alle semplici istruzioni OUTER JOIN in Entity SQL.
    3. Non è ancora ansible utilizzare LIKE con la corrispondenza generale del modello.

    Maggiori informazioni disponibili qui:

    Considerazioni sulle prestazioni per Entity Framework

    Entity Framework e NoTracking

    La disabilitazione del tracciamento causerà anche il stream dei set di risultati in memoria. Questo è più efficiente quando si lavora con grandi set di dati e non è necessario l’intero set di dati in una sola volta.

    Riferimenti:

    • Come evitare l’overflow della memoria quando si eseguono query su dataset di grandi dimensioni con Entity Framework e LINQ
    • Set di dati di grandi dimensioni di Entity Framework, eccezione di memoria esaurita

    AsNoTracking () consente di aggirare il requisito “chiave unica per record” in EF (non menzionato esplicitamente da altre risposte).

    Ciò è estremamente utile quando si legge una vista che non supporta una chiave univoca perché forse alcuni campi sono annullabili o la natura della vista non è logicamente indicizzabile.

    Per questi casi, la “chiave” può essere impostata su qualsiasi colonna non annullabile, ma AsNoTracking () deve essere utilizzata con tutti i record di query else (duplicati per chiave) verranno saltati.

    Se hai qualcos’altro che altera il DB (ad esempio un altro processo) e devi assicurarti di vedere queste modifiche, usa AsNoTracking() , altrimenti EF potrebbe darti l’ultima copia che il tuo contesto aveva, quindi è meglio usarne una nuova contesto ogni query:

    http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/