Entity Framework - DbContext

O Entity Framework permite consultar, inserir, atualizar e excluir dados, usando objetos Common Language Runtime (CLR), que são conhecidos como entidades. O Entity Framework mapeia as entidades e relacionamentos definidos em seu modelo para um banco de dados. Ele também oferece recursos para -

  • Materializar dados retornados do banco de dados como objetos de entidade
  • Rastreie as alterações feitas nos objetos
  • Lidar com simultaneidade
  • Propagar alterações de objetos de volta ao banco de dados
  • Vincular objetos a controles

A classe primária responsável por interagir com os dados como objetos é System.Data.Entity.DbContext. A API DbContext não é lançada como parte do .NET Framework. Para ser mais flexível e frequente com o lançamento de novos recursos para Code First e DbContext API, a equipe do Entity Framework distribui EntityFramework.dll por meio do recurso de distribuição NuGet da Microsoft.

  • O NuGet permite que você adicione referências aos seus projetos .NET puxando as DLLs relevantes diretamente da Web para o seu projeto.

  • Uma extensão do Visual Studio chamada Library Package Manager fornece uma maneira fácil de puxar o assembly apropriado da Web para seus projetos.

  • A API DbContext é voltada principalmente para simplificar sua interação com o Entity Framework.

  • Também reduz o número de métodos e propriedades de que você precisa para acessar as tarefas mais usadas.

  • Nas versões anteriores do Entity Framework, essas tarefas eram frequentemente complicadas de descobrir e codificar.

  • A classe de contexto gerencia os objetos de entidade durante o tempo de execução, o que inclui o preenchimento de objetos com dados de um banco de dados, controle de alterações e persistência de dados no banco de dados.

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 EF Designer, o contexto será gerado para você. Se você estiver trabalhando com o Code First, normalmente escreverá o contexto sozinho.

O código a seguir é um exemplo simples que mostra que UniContext é derivado de DbContext.

  • Você pode usar propriedades automáticas com DbSet, como getter e setter.

  • Ele também torna o código muito mais limpo, mas você não é obrigado a usá-lo para criar um DbSet quando não há outra lógica para aplicar.

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • Anteriormente, o EDM era usado para gerar classes de contexto derivadas da classe ObjectContext.

  • Trabalhar com ObjectContext foi um pouco complexo.

  • DbContext é um wrapper em torno do ObjectContext que é realmente semelhante ao ObjectContext e é útil e fácil em todos os modelos de desenvolvimento, como Code First, Model First e Database First.

Consultas

Existem três tipos de consultas que você pode usar, como -

  • Adicionando uma nova entidade.
  • Alterar ou atualizar os valores de propriedade de uma entidade existente.
  • Excluindo uma entidade existente.

Adicionando Novas Entidades

Adicionar um novo objeto com o Entity Framework é tão simples quanto construir uma nova instância do seu objeto e registrá-lo usando o método Add em DbSet. O código a seguir é para quando você deseja adicionar um novo aluno ao banco de dados.

private static void AddStudent() {

   using (var context = new UniContext()) {

      var student = new Student {
         LastName = "Khan", 
         FirstMidName = "Ali", 
         EnrollmentDate = DateTime.Parse("2005-09-01") 
      };

      context.Students.Add(student); 
      context.SaveChanges();

   }
}

Alterando Entidades Existentes

Alterar objetos existentes é tão simples quanto atualizar o valor atribuído às propriedades que você deseja alterar e chamar SaveChanges. No código a seguir, o sobrenome de Ali foi alterado de Khan para Aslam.

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

Excluindo Entidades Existentes

Para excluir uma entidade usando o Entity Framework, você usa o método Remove em DbSet. Remova obras para entidades existentes e recém-adicionadas. Chamar Remove em uma entidade que foi adicionada, mas ainda não salva no banco de dados, cancelará a adição da entidade. A entidade é removida do rastreador de alterações e não é mais rastreada pelo DbContext. Chamar Remove em uma entidade existente que está sendo controlada por alterações registrará a entidade para exclusão na próxima vez que SaveChanges for chamado. O exemplo a seguir mostra uma instância em que o aluno é removido do banco de dados cujo primeiro nome é Ali.

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}