Controle vs. Consultas de acompanhamento nãoTracking vs. No-Tracking Queries

Controles de comportamento de controle se ou não 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 é rastreada, qualquer alteração detectada na entidade serão mantidas 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 será correção também o propriedades de navegação entre entidades que são obtidas de um rastreamento 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

Você pode exibir este artigo exemplo no GitHub.You can view this article's sample on GitHub.

Consultas de acompanhamentoTracking queries

Por padrão, as consultas que retornam tipos de entidade são controle.By default, queries that return entity types are tracking. Isso significa que você pode fazer alterações às instâncias de entidade e tem essas alterações persistirão 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 persistentes 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 de acompanhamento nãoNo-tracking queries

Nenhuma consulta de rastreamento é ú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 executar porque não há nenhuma necessidade de informações do controle de alterações de configuração.They are quicker to execute because there is no need to setup change tracking information.

Você pode trocar uma consulta individual para controle de não ser: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 no nível de instância do contexto de controle padrão: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

Nenhuma consulta de controle ainda executar a resolução de identidade dentro da consulta de executar.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, 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 coleta de lixo é executado, você pode 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 obter mais informações, consulte como funciona a consulta.For more information, see How Query Works.

Projeções e controleTracking and projections

Mesmo se o tipo de resultado da consulta não é um tipo de entidade, se o resultado contém tipos de entidade ainda serão rastreados 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 resultado do conjunto 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 contém nenhum tipo de entidade, é executado sem rastreamento.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 controle executada.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
            });
}