Entity Framework
Tracking vs. No-Tracking
Ricerca…
Osservazioni
Il monitoraggio del comportamento controlla se Entity Framework manterrà le informazioni su un'istanza di entità nel suo tracker delle modifiche. Se viene rilevata un'entità, tutte le modifiche rilevate nell'entità verranno mantenute nel database durante SaveChanges()
.
Tracciamento di domande
- Per impostazione predefinita, le query che restituiscono tipi di entità eseguono il tracciamento
- Ciò significa che è possibile apportare modifiche a tali istanze di entità e mantenere tali modifiche persistenti da
SaveChanges()
Esempio :
- La modifica alla valutazione del
book
verrà rilevata e mantenuta nel database duranteSaveChanges()
.
using (var context = new BookContext())
{
var book = context.Books.FirstOrDefault(b => b.BookId == 1);
book.Rating = 5;
context.SaveChanges();
}
Query senza tracciamento
- Nessuna query di tracciamento è utile quando i risultati vengono utilizzati in uno scenario di
read-only
- Sono
quicker to execute
perché non è necessario configurare le informazioni sul rilevamento delle modifiche
Esempio :
using (var context = new BookContext())
{
var books = context.Books.AsNoTracking().ToList();
}
Con EF Core 1.0 è anche possibile modificare il comportamento di tracciamento predefinito al livello di context instance
del context instance
.
Esempio :
using (var context = new BookContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var books = context.Books.ToList();
}
Tracking e proiezioni
- Anche se il tipo di risultato della query non è un tipo di entità, se il risultato
contains entity
tipi dicontains entity
, verranno comunquetracked by default
Esempio :
Nella seguente query, che restituisce un
anonymous type
,will be tracked
le istanze diBook
nel set di risultatiusing (var context = new BookContext()) { var book = context.Books.Select(b => new { Book = b, Authors = b.Authors.Count() }); }
Se il set di risultati
does not
contiene alcun tipo dientity
,no tracking
viene eseguitono tracking
Esempio :
Nella seguente query, che restituisce un
anonymous type
con alcuni valori dall'entità (mano instances
del tipo dientity
reale), non viene eseguito alcun monitoraggio .using (var context = new BookContext()) { var book = context.Books.Select(b => new { Id = b.BookId, PublishedDate = b.Date }); }