Entity Framework
Seguimiento vs No-seguimiento
Buscar..
Observaciones
El comportamiento de seguimiento controla si Entity Framework mantendrá información sobre una instancia de entidad en su rastreador de cambios. Si se realiza un seguimiento de una entidad, todos los cambios detectados en la entidad se conservarán en la base de datos durante SaveChanges()
.
Consultas de seguimiento
- De forma predeterminada, las consultas que devuelven tipos de entidad están siguiendo
- Esto significa que puede realizar cambios en esas instancias de entidad y que
SaveChanges()
esos cambiosSaveChanges()
Ejemplo:
- El cambio en la calificación del
book
se detectará y se conservará en la base de datos duranteSaveChanges()
.
using (var context = new BookContext())
{
var book = context.Books.FirstOrDefault(b => b.BookId == 1);
book.Rating = 5;
context.SaveChanges();
}
Consultas sin seguimiento
- Ninguna consulta de seguimiento es útil cuando los resultados se utilizan en un escenario de
read-only
- Son
quicker to execute
porque no es necesario configurar la información de seguimiento de cambios
Ejemplo:
using (var context = new BookContext())
{
var books = context.Books.AsNoTracking().ToList();
}
Con EF Core 1.0, también puede cambiar el comportamiento de seguimiento predeterminado en el nivel de context instance
.
Ejemplo:
using (var context = new BookContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var books = context.Books.ToList();
}
Seguimiento y proyecciones.
- Incluso si el tipo de resultado de la consulta no es un tipo de entidad, si el resultado
contains entity
tipos decontains entity
, todavía setracked by default
Ejemplo:
En la siguiente consulta, que devuelve un
anonymous type
,will be tracked
las instancias deBook
en el conjunto de resultadosusing (var context = new BookContext()) { var book = context.Books.Select(b => new { Book = b, Authors = b.Authors.Count() }); }
Si el conjunto de resultados
does not
contiene ningún tipo deentity
,no tracking
se realizano tracking
Ejemplo:
En la siguiente consulta, que devuelve un
anonymous type
con algunos de los valores de la entidad (perono instances
del tipo deentity
real), no se realiza ningún seguimiento .using (var context = new BookContext()) { var book = context.Books.Select(b => new { Id = b.BookId, PublishedDate = b.Date }); }