Consultas com acompanhamento versus Consultas sem acompanhamentoTracking vs. No-Tracking Queries

O comportamento de acompanhamento controla se o Entity Framework Core manterá as informações sobre uma instância de entidade em seu controlador de alterações.Tracking behavior controls whether or not Entity Framework Core will keep information about an entity instance in its change tracker. Se uma entidade é acompanhada, qualquer alteração detectada na entidade será mantida no banco de dados durante a SaveChanges().If an entity is tracked, any changes detected in the entity will be persisted to the database during SaveChanges(). Entity Framework Core também corrigirá as propriedades de navegação entre as entidades que são obtidas de um acompanhamento de consulta e entidades que foram previamente carregadas para a instância de DbContext.Entity Framework Core will also fix-up navigation properties between entities that are obtained from a tracking query and entities that were previously loaded into the DbContext instance.

Dica

Veja o exemplo deste artigo no GitHub.You can view this article's sample on GitHub.

Consultas com acompanhamentoTracking queries

Por padrão, as consultas que retornam tipos de entidade são de acompanhamento.By default, queries that return entity types are tracking. Isso significa que você pode fazer alterações às instâncias da entidade e fazer essas alterações serem persistidas por SaveChanges().This means you can make changes to those entity instances and have those changes persisted by SaveChanges().

No exemplo a seguir, a alteração para a classificação de blogs será detectada e persistida no banco de dados durante a SaveChanges().In the following example, the change to the blogs rating will be detected and persisted to the database during SaveChanges().

using (var context = new BloggingContext())
{
    var blog = context.Blogs.SingleOrDefault(b => b.BlogId == 1);
    blog.Rating = 5;
    context.SaveChanges();
}

Consultas sem acompanhamentoNo-tracking queries

As consulta sem acompanhamento são úteis quando os resultados são usados em um cenário de somente leitura.No tracking queries are useful when the results are used in a read-only scenario. Eles são mais rápidos de executar porque não há necessidade de configurar informações de controle de alterações.They are quicker to execute because there is no need to setup change tracking information.

Você pode trocar uma consulta individual para ser sem acompanhamento:You can swap an individual query to be no-tracking:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .AsNoTracking()
        .ToList();
}

Você também pode alterar o comportamento de acompanhamento padrão no nível de instância do contexto:You can also change the default tracking behavior at the context instance level:

using (var context = new BloggingContext())
{
    context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

    var blogs = context.Blogs.ToList();
}

Observação

As consultas sem acompanhamento ainda executam a resolução de identidade dentro da consulta de execução.No tracking queries still perform identity resolution within the excuting query. Se o conjunto de resultados contém a mesma entidade várias vezes, a mesma instância da classe da entidade será retornada para cada ocorrência do conjunto de resultados.If the result set contains the same entity multiple times, the same instance of the entity class will be returned for each occurrence in the result set. No entanto, as referências fracas são usadas para controlar as entidades que já foram retornadas.However, weak references are used to keep track of entities that have already been returned. Se um resultado anterior com a mesma identidade sai do escopo e a coleta de lixo é executada, você poderá receber uma nova instância da entidade.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance. Para saber mais, veja Como funciona a consulta.For more information, see How Query Works.

Acompanhamento e projeçõesTracking and projections

Mesmo se o tipo de resultado da consulta não for um tipo de entidade, se o resultado contiver tipos de entidade, ele ainda será rastreado por padrão.Even if the result type of the query isn't an entity type, if the result contains entity types they will still be tracked by default. Na consulta a seguir, que retorna um tipo anônimo, as instâncias do Blog no conjunto de resultados será rastreado.In the following query, which returns an anonymous type, the instances of Blog in the result set will be tracked.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Select(b =>
            new
            {
                Blog = b,
                Posts = b.Posts.Count()
            });
}

Se o conjunto de resultados não contiver tipos de entidade, nenhum acompanhamento será executado.If the result set does not contain any entity types, then no tracking is performed. Na consulta a seguir, que retorna um tipo anônimo com alguns dos valores da entidade (mas não há instâncias do tipo de entidade real), não há nenhum acompanhamento executado.In the following query, which returns an anonymous type with some of the values from the entity (but no instances of the actual entity type), there is no tracking performed.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Select(b =>
            new
            {
                Id = b.BlogId,
                Url = b.Url
            });
}