Partilhar via


Como trabalhar com DbContext

Para usar o Entity Framework para consultar, inserir, atualizar e excluir dados usando objetos .NET, primeiro você precisa Criar um Modelo que mapeie as entidades e relações definidas em seu modelo para tabelas em um banco de dados.

Depois de ter um modelo, a classe primária com a qual seu aplicativo interage é System.Data.Entity.DbContext (geralmente conhecida como classe de contexto). Você pode usar um DbContext associado a um modelo para:

  • Como gravar e executar consultas
  • Materializar os resultados da consulta como objetos de entidade
  • Controlar as alterações feitas nesses objetos
  • Persistir alterações de objeto no banco de dados
  • Associar objetos na memória a controles de interface do usuário

Esta página fornece algumas diretrizes sobre como gerenciar a classe de contexto.

Como definir uma classe derivada de DbContext

Para trabalhar com contexto, recomendamos definir uma classe que deriva de DbContext e expõe propriedades DbSet que representam coleções das entidades especificadas no contexto. Se você estiver trabalhando com o Designer do EF, o contexto será gerado para você. Se você estiver trabalhando com o Code First, normalmente escreverá o contexto por conta própria.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

Depois de ter um contexto, você consultaria, adicionaria (usando os métodos Add ou Attach) ou removeria (usando entidadesRemove) no contexto por meio dessas propriedades. Acessar uma propriedade DbSet em um objeto de contexto representa uma consulta inicial que retorna todas as entidades do tipo especificado. Observe que apenas acessar uma propriedade não executará a consulta. Uma consulta é executada quando:

  • Ela é enumerada por uma instrução foreach (C#) ou For Each (Visual Basic).
  • Ela é enumerada por uma operação de coleção, como ToArray, ToDictionary ou ToList.
  • Operadores LINQ, como FirstFirstAny ou Any são especificados na parte mais externa da consulta.
  • Um dos seguintes métodos é chamado: o método de extensão Load, DbEntityEntry.ReloadDatabase.ExecuteSqlCommand e DbSet<T>.Find, se uma entidade com a chave especificada não for encontrada já carregada no contexto.

Tempo de vida

O tempo de vida do contexto começa quando a instância é criada e termina quando a instância é descartada ou jogada fora. Use using se você desejar que todos os recursos que o contexto controla sejam descartados no final do bloco. Quando você usa using, o compilador cria automaticamente um bloco try/finally e chamadas descartadas no bloco finally.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

Aqui estão algumas diretrizes gerais para decidir sobre o tempo de vida do contexto do objeto:

  • Ao trabalhar com aplicativos Web, use uma instância do contexto de objeto por solicitação.
  • Ao trabalhar com o Windows Presentation Foundation (WPF) ou com o Windows Forms, use uma instância do contexto de objeto por formulário. Isso permite que você use a funcionalidade de controle de alterações que contextos de objeto fornecem.
  • Se a instância de contexto for criada por um contêiner de injeção de dependência, geralmente é responsabilidade do contêiner descartar o contexto.
  • Se o contexto for criado no código do aplicativo, lembre-se de descartar o contexto quando ele não for mais necessário.
  • Ao trabalhar com o contexto do objeto de longa execução, considere o seguinte:
    • À medida que você carrega mais objetos e suas referências na memória, o consumo de memória do contexto pode aumentar rapidamente. Isso pode causar problemas de desempenho.
    • O contexto não é thread-safe, portanto, ele não deve ser compartilhado entre vários threads que trabalham nele simultaneamente.
    • Se uma exceção fez o contexto de objeto estar em um estado irrecuperável, todo o aplicativo poderá ser encerrado.
    • As chances de ocorrerem problemas relacionados à simultaneidade aumentam de acordo com o intervalo entre o tempo em que os dados são consultados e atualizados.

Conexões

Por padrão, o contexto de objeto gerencia conexões com o banco de dados. O contexto de objeto abre e fecha conexões conforme o necessário. Por exemplo, o contexto de objeto abre a conexão para executar uma consulta e, em seguida, fecha a conexão quando todos os conjuntos de resultados tiverem sido processados.

Há casos em que você deseja ter mais controle sobre quando a conexão abre e fecha. Por exemplo, ao trabalhar com o SQL Server Compact, geralmente é recomendável manter uma conexão aberta separada com o banco de dados durante o tempo de vida do aplicativo para melhorar o desempenho. Você pode gerenciar esse processo manualmente usando a propriedade Connection.