Curso Entity Framework - CRUD no cenário Desconectado - XVIII


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

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 :

Preparando o ambiente

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_CRUDDesconectado na solução;

No Menu FILE clique em Add -> New Project e selecione o template Visual C# -> Console Application informando o nome EF6_CRUDDesconectado:

Para concluir inclua uma referência no projeto EF6_CRUDDesconectado 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.

O CRUD no cenário Desconectado

O Entity Framework fornece alguns métodos importantes para anexar entidades desconectadas a um novo contexto e também definir o EntityState para todas as entidades do gráfico.

Vemos os principais:

1- DbSet.Add()

O método DbSet.Add() anexa um gráfico de entidades inteiro para um novo contexto e automaticamente aplica o estado de entidade Added para todas as entidades.

Vejamos o exemplo abaixo:

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 entidade Aluno, 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.

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

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

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