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:
Precisamos anexar as entidades com a nova instância do contexto e fazer com que o contexto tenha conhecimento destas entidades;
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: