Curso Entity Framework – CRUD no cenário Conectado
Nesta aula vamos falar sobre o CRUD no cenário conectado no Entity Framework.
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.
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:
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.









