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:
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.