Curso Entity Framework - CRUD no cenário Conectado - XVII


  Nesta aula vamos falar sobre o CRUD no cenário conectado no Entity Framework.(aula anterior)

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 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 - Entity Framework - Consultas Projeção -  para mostrar o CRUD no cenário conectado.

Abra a solução EF6_EscolaDB criada e após isso inclua um novo projeto do tipo Console Application com o nome 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:

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 projeto EF6_EscolaDB no arquivo App.Config do projeto atual.

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

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();
            }
        }
    }
}
CRUD no cenário conectado

Se a propriedade AutoDetectChangesEnabled for definida como false:

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 apenas no DbSet. Se você executar a 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.

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();
            }
        }
    }
}
CRUD realizado na lista e não do DbSet

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

E, porque sois filhos, Deus enviou aos vossos corações o Espírito de seu Filho, que clama: Aba, Pai.
Assim que já não és mais servo, mas filho; e, se és filho, és também herdeiro de Deus por Cristo.

Gálatas 4:6,7

 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti