Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- 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.
Definindo uma classe derivada de DbContext
A maneira recomendada de trabalhar com contexto é 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 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 Add ou Attach métodos) ou removeria (usando Remove) entidades no contexto por meio dessas propriedades. Acessar uma DbSet propriedade 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:
- Ele é enumerado por uma
foreachinstrução (C#) ouFor Each(Visual Basic). - Ele é enumerado por uma operação de coleção, como
ToArray,ToDictionaryouToList. - Operadores LINQ, como
FirstouAnysão especificados na parte mais externa da consulta. - Um dos seguintes métodos é chamado: o
Loadmétodo de extensão,DbEntityEntry.Reload,Database.ExecuteSqlCommandeDbSet<T>.Find, se uma entidade com a chave especificada não for encontrada 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 coletada pelo coletor de lixo. Use using se você quiser que todos os recursos controlados pelo contexto sejam descartados no final do bloco. Quando você usa using, o compilador cria automaticamente um bloco try/finally e chama o método dispose no bloco finalmente.
public void UseProducts()
{
using (var context = new ProductContext())
{
// Perform data access using the context
}
}
Aqui estão algumas diretrizes gerais ao decidir sobre o tempo de vida do contexto:
- Ao trabalhar com aplicativos Web, use uma instância de contexto por solicitação.
- Ao trabalhar com o WPF (Windows Presentation Foundation) ou o Windows Forms, use uma instância de contexto por formulário. Isso permite que você use a funcionalidade de controle de alterações fornecida pelo contexto.
- 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 contexto 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 fizer com que o contexto esteja em um estado irrecuperável, todo o aplicativo poderá ser encerrado.
- As chances de enfrentar problemas relacionados à concorrência aumentam à medida que a diferença entre o tempo em que os dados são consultados e atualizados cresce.
Conexões
Por padrão, o contexto gerencia conexões com o banco de dados. O contexto abre e fecha as conexões conforme necessário. Por exemplo, o contexto abre uma conexão para executar uma consulta e fecha a conexão quando todos os conjuntos de resultados são processados.
Há casos em que você deseja ter mais controle sobre quando a conexão é aberta e fechada. 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 Connection propriedade.