Back-End

11 nov, 2015

Curso Entity Framework – CRUD no cenário desconectado

Publicidade

Nesta aula vamos falar sobre o CRUD no cenário desconectado no Entity Framework.

Antes de ver como realizar operações CRUD em um gráfico de entidades desconectados, vamos ver como associar este gráfico de entidades com uma nova instância do contexto.

Nota: Um gráfico de entidade refere-se a um conjunto de entidades.

Existem duas coisas que precisamos fazer para obter um gráfico de entidade desconectado ou uma simples entidade desconectada:

  1. Precisamos anexar as entidades com a nova instância do contexto e fazer com que o contexto tenha conhecimento destas entidades;

  2. Precisamos definir os estados das entidades – EntityStates – a essas entidades manualmente visto que a nova instância do contexto não conhece nada sobre as operações realizadas nas entidades desconectadas e não pode aplicar o EntityState apropriado.

A figura a seguir ilustra esse processo:

ef_curb181

using System;
using EF6_EscolaDB;
namespace EF6_CRUDDesconectado
{
    class Program
    {
        static void Main(string[] args)
        {
            //grafico de entidade desconectado
            Aluno alunoDesconectado = new Aluno() { AlunoNome = "Nov Aluno Macoratti" };
            alunoDesconectado.AlunoEndereco = new AlunoEndereco() { Endereco1 = "Endereco Aluno Desconetado", Cidade = "Cidade Aluno Desconectado" };
            using (var ctx = new EscolaDBEntities())
            {
                //adicioina um grafico de entidade aluno desconectado a nova instãncia do contexto
                ctx.Alunos.Add(alunoDesconectado);
                // obtem a instãncia DbEntityEntry para verificar o EntityState da entidade especificada
                // Nota: O método Entry obtém um objeto DbEntityEntry para a entidade fornecento o acesso 
                // às informações sobre a entidade e a capacidade de executar ações na entidade.
                var alunoEntrada = ctx.Entry(alunoDesconectado);
                var enderecoEntrada = ctx.Entry(alunoDesconectado.AlunoEndereco);
                Console.WriteLine("EntityState do Aluno         : {0}", alunoEntrada.State);
                Console.WriteLine("EntityState do AlunoEndereco : {0}", enderecoEntrada.State);
                Console.ReadKey();
            }
        }
    }
}

Neste código estamos adicionando o gráfico de entidade alunoDesconectado utilizando o método ctx.Alunos.Add(). Aqui, a entidade pai é a entidadeAluno, então nós adicionamos o gráfico da entidade completa no DbSet Alunos.

Obtivemos, assim, uma instância de DbEntityEntry (usando o método Entry) para as entidades AlunoDesconectado e AlunoEndereco para verificar o estado de cada entidade. Como você pode ver no resultado obtido, ambas as entidades tem o seu estado definido como Added.

Dessa forma, usamos o método Add da entidade DbSet pai para anexar todo gráfico da entidade na nova instância do contexto com o estado definido como Added a cada entidade.

Isto irá executar o comando insert para todas as entidades, que irão inserir novas linhas na tabela do banco de dados.

DbSet.Attach()

O método DbSete.Attach() anexa todo o gráfico da entidade para o novo contexto com o estado da entidade definido como Unchanged.

Considere este exemplo:

using System;
using EF6_EscolaDB;
namespace EF6_CRUDDesconectado
{
    class Program
    {
        static void Main(string[] args)
        {
            //grafico de entidade desconectado
            Aluno alunoDesconectado = new Aluno() { AlunoNome = "Nov Aluno Macoratti" };
            alunoDesconectado.AlunoEndereco = new AlunoEndereco() { Endereco1 = "Endereco Aluno Desconetado", Cidade = "Cidade Aluno Desconectado" };
            using (var ctx = new EscolaDBEntities())
            {
                //adicioina um grafico de entidade aluno desconectado a nova instãncia do contexto
                ctx.Alunos.Attach(alunoDesconectado);
                // obtem a instãncia DbEntityEntry para verificar o EntityState da entidade especificada
                // Nota: O método Entry obtém um objeto DbEntityEntry para a entidade fornecento o acesso 
                // às informações sobre a entidade e a capacidade de executar ações na entidade.
                var alunoEntrada = ctx.Entry(alunoDesconectado);
                var enderecoEntrada = ctx.Entry(alunoDesconectado.AlunoEndereco);
                Console.WriteLine("EntityState do Aluno         : {0}", alunoEntrada.State);
                Console.WriteLine("EntityState do AlunoEndereco : {0}", enderecoEntrada.State);
                Console.ReadKey();
            }
        }
    }
}

No código acima estamos usando o método DbSet.Attach() para anexar um gráfico de entidade desconectada. Isto irá anexar todo o gráfico da entidade para o novo contexto, definindo o estado de todas as entidades como Unchanged.

Assim, o método Attach() irá somente anexar o gráfico da entidade ao contexto.

DbSet.Entry()

O método Entry do DbContext retorna uma instância DbEntityEntry para uma determinada entidade. O DbEntityEntry pode ser usado para alterar o estado de uma entidade.

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.

DbContext.Entry (entidadeDesconectada) .state = EntityState.Added/Modified/Deleted/Unchanged

Este método anexa um gráfico completo da entidade para o contexto com o estado especificado da entidade pai e define o estado de outras entidades, como mostrado na tabela a seguir.

 Entity State Pai Entity State de todas as entidades filhas
Added Added
Modified Unchanged
Deleted Todas as entidades filhas serão null

Na próxima aula veremos como adicionar uma entidade simples em um cenário desconectado no Entity Framework.