Podemos usar três abordagens para realizar a tarefa de atualizar dados de uma entidade.
Se você desejar usar a abordagem DataBase-First, então pode criar um Entity Data Model para o banco de dados EscolaDB.mdf definido na aula Entity Framework – configurando o ambiente.
Se você usar a abordagem Code-First ou Model-First, então deverá criar as entidades e classes de contexto com base no mesmo banco de dados.
Nesta aula, vamos atualizar a entidade Aluno que foi definida com o seguinte código:
namespace EF6_EscolaDB { using System; using System.Collections.Generic; public partial class Aluno { public Aluno() { this.Cursos = new HashSet<Curso>(); } public int AlunoId { get; set; } public string AlunoNome { get; set; } public int PadraoId { get; set; } public virtual Padrao Padrao { get; set; } public virtual AlunoEndereco AlunoEndereco { get; set; } public virtual ICollection<Curso> Cursos { get; set; } } }
A seguir temos o código da classe de Contexto:
namespace EF6_EscolaDB { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; public partial class EscolaDBEntities : DbContext { public EscolaDBEntities() : base("name=EscolaDBEntities") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<Aluno> Alunos { get; set; } public virtual DbSet<AlunoEndereco> AlunoEnderecos { get; set; } public virtual DbSet<Curso> Cursos { get; set; } public virtual DbSet<Padrao> Padraos { get; set; } public virtual DbSet<Professor> Professores { get; set; } } }
Preparando o ambiente
Vamos usar a solução criada na aula Entity Framework – Consultas Projeção – EF6_EscolaDB – para mostrar como atualizar uma entidade no cenário desconectado.
Abra a solução EF6_EscolaDB e a seguir clique no menu FILE -> Add -> New Project.
Selecione a linguagem Visual C# e o template Console Application, e informe o nome EF6_AtualizaEntidades :
A seguir, inclua uma referência ao projeto EF6_EscolaDB e atualize também o arquivo App.Config com a string de conexão para a entidade.
Atualizando uma entidade Aluno
Neste exemplo, usamos o método Entry() para marcar a entidade que foi modificada fora do contexto como modificada (Modified).
Para persistir os dados no banco de dados, usamos o método SaveChanges().
Nota: O método Entry obtém um objeto DbEntityEntry para a entidade fornecendo o acesso às informações sobre a entidade e a capacidade de executar ações na entidade.
A seguir, o código usado para realizar a atualização de uma entidade Aluno:
static void AtualizandoEntidadeSimples() { Aluno _aluno; //1. Pega o aluno do DB using (var ctx = new EscolaDBEntities()) { _aluno = ctx.Alunos.Where(a => a.AlunoNome == "Macoratti").FirstOrDefault<Aluno>(); } //2. Altera o nome do aluno no modo desconectado (fora do escopo do contexto ctx) if (_aluno != null) { _aluno.AlunoNome = "Macoratti Atualizado"; } //salva a entidade modificada usando o novo contexto using (var dbCtx = new EscolaDBEntities()) { //3. Marca a entidade como modificada dbCtx.Entry(_aluno).State = System.Data.Entity.EntityState.Modified; //4. chama o método SaveChanges dbCtx.SaveChanges(); } }
A seguir, temos a sequência das operações realizadas:
- Pegamos um aluno existente com o nome Macoratti a partir do banco de dados;
- Alteramos o nome do aluno fora do escopo do contexto (modo desconectado);
- Passamos a entidade modificada para o método Entry() para obter o seu objeto DBEntityEntry e então marcar o seu estado como Modified;
- Chamamos o método SaveChanges() para atualizar a informação do aluno no banco de dados.
O método DBContext.Entry retorna um instância de DBEntityEntry para uma entidade especificada, e a classe DbEntityEntry fornece o acesso à informação sobre a entidade e seu estado.
Na próxima aula, veremos como deletar uma entidade simples em um cenário desconectado no Entity Framework.