Back-End

6 nov, 2015

Curso Entity Framework – CRUD no cenário Conectado

Publicidade

Nesta aula vamos falar sobre o CRUD no cenário conectado no Entity Framework (caso queira ver as aulas anteriores, acesse aqui).

Realizar as operações CRUD no cenário Conectado é muito simples porque o contexto automaticamente rastreia as modificações ocorridas na entidade durante o seu tempo de vida, visto que a AutoDetectChangesEnabled é definida como true por padrão no Entity Framework.

Por padrão, o Entity Framework detecta as alterações automaticamente quando os seguintes métodos são chamados:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Remove
  • DbSet.Add
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries.

O CRUD no cenário Conectado

Vamos usar a solução criada na aula 11 para mostrar o CRUD no cenário Conectado. Abra a solução EF6_EscolaDB criada e  inclua um novo projeto do tipo Console Application, com o nome de EF6_CRUDConectado na solução.

No Menu FILE, clique em Add -> New Project e selecione o template Visual C# -> Console Application informando o nome EF6_CRUDConectado:

ef_curb171

Para concluir, inclua uma referência no projeto EF6_CRUDConectado para o projeto EF6_EscolaDB e inclua também a string de conexão do projetoEF6_EscolaDB no arquivo App.Config do projeto atual.

A seguir, inclua o código abaixo no arquivo Program.cs.

CRUD no cenário Conectado:

using System;
using System.Linq;
using EF6_EscolaDB;
namespace EF6_CRUDConectado
{
    class Program
    {
        static void Main(string[] args)
        {
            //note que estamos trabalhando no mesmo contexto
            //------------------------------------------------
            using (var ctx = new EscolaDBEntities())
            {
                var listaAluno = ctx.Alunos.ToList<Aluno>();
                //Cria um  novo aluno
                ctx.Alunos.Add(new Aluno() { AlunoNome = " * Novo Aluno *" });
                //Realiza uma operação de atualização
                Aluno alunoAlterado = listaAluno.Where(a => a.AlunoNome == "Aluno1").FirstOrDefault<Aluno>();
                alunoAlterado.AlunoNome = "Aluno 1 Editado";
                //Realiza uma exclusão
                ctx.Alunos.Remove(listaAluno.ElementAt<Aluno>(0));
                //Persiste as operações no banco de dados
                ctx.SaveChanges();
                Console.ReadKey();
            }
        }
    }
}

Se a propriedade AutoDetectChangesEnabled for definida como false:

 class="brush: text; gutter: true">context.Configuration.AutoDetectChangesEnabled = false

então, o contexto não poderá detectar alterações feitas nas entidades existentes e por isso não vai executar a consulta de atualização.

Para isso, você precisa chamar o método context.ChangeTracker.DetectChanges() antes de SaveChanges(), a fim de detectar entidades editadas e marcar o seu status como Modified (modificado).

O Contexto detecta as operações para adicionar e excluir a entidade quando a operação é realizada – e apenas no DbSet. Se você executar as operações para adicionar e excluir uma entidade na coleção ou lista separada, então ele não vai detectar essas alterações.

O código a seguir não irá inserir ou excluir um aluno. Ele só vai atualizar a entidade Aluno, porque estamos adicionando e excluindo entidades da lista não do DbSet.

CRUD realizado na lista e não do DbSet:

using System;
using System.Linq;
using EF6_EscolaDB;
namespace EF6_CRUDConectado
{
    class Program
    {
        static void Main(string[] args)
        {
            //note que estamos trabalhando no mesmo contexto
            //------------------------------------------------
            using (var ctx = new EscolaDBEntities())
            {
                var listaAluno = ctx.Alunos.ToList<Aluno>();
                //Cria um  novo aluno na lista
                listaAluno.Add(new Aluno() { AlunoNome = " * Novo Aluno *" });
                //Realiza uma operação de atualização (somente esta operação é persistida)
                Aluno alunoAlterado = listaAluno.Where(a => a.AlunoNome == "Aluno1").FirstOrDefault<Aluno>();
                alunoAlterado.AlunoNome = "Aluno 1 Editado";
                //Realiza uma exclusão na lista
                if(listaAluno.Count > 0)
                     listaAluno.Remove(listaAluno.ElementAt<Aluno>(0));
                //Persiste as operações no banco de dados
                ctx.SaveChanges();
                Console.ReadKey();
            }
        }
    }
}

Na próxima aula veremos o CRUD no cenário desconectado no Entity Framework.