Back-End

10 dez, 2015

Curso Entity Framework – Adicionando um grafo de entidade usando o DBContext no modo desconectado

Publicidade

Nesta aula (clique aqui para ver a aula anterior), vou mostrar como adicionar um grafo de entidades (um conjunto de entidades ou objetos) no cenário desconectado usando o DBContext.

Quando temos mais de uma entidade envolvida em um processo de atualização ou persistência, temos o que é conhecido como grafo de entidades ou objetos.

Como exemplo, podemos citar uma operação de um carrinho de compras, onde temos as entidades Pedidos, Detalhes dos Pedidos, Clientes e Produtos envolvidas na transação.

Adicionar um grafo de entidades com todas as novas entidades não é uma tarefa complexa como pode parecer à primeira vista.

Para poder realizar essa operação, podemos usar o método DbSet.Add() para anexar todo o grafo de entidades ao contexto e, a seguir, definir todos os estados das entidades como Added, como já vimos antes.

No exemplo desta aula vamos adicionar uma grafo de entidades Aluno no modo desconectado usando o método DbSet.Add(), que marca o estado de todas as entidades como Added.

Preparando o ambiente

Vamos usar a solução criada na aula 11 para mostrar como para mostrar como adicionar um grafo de entidades.

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

ef_curb221

A seguir, inclua uma referência neste projeto ao projeto EF6_EscolaDB e atualize também o arquivo App.Config com a string de conexão para a entidade:

...
<connectionStrings>
<add name="EscolaDBEntities" connectionString="metadata=res://*/EscolaDB.csdl|res://*/EscolaDB.ssdl|res://*/EscolaDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=EscolaDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /></connectionStrings>
...

Adicionando um grafo de entidades aluno

Abra o arquivo Program.cs e inclua o código abaixo neste arquivo:

using System;
using System.Linq;
using EF6_EscolaDB;
namespace EF6_Adicionado_Grafo_Entidades
{
    class Program
    {
        static void Main(string[] args)
        {
            //Cria um aluno no modo desconectado
            Aluno novoAluno = new Aluno() { AlunoNome = "Novo Aluno Aula 22" };
            //Atribui um novo padrão a nova entidade aluno
            novoAluno.Padrao = new Padrao() { PadraoNome = "Novo Padrao - Aula 22", Descricao = "Nova descricao do novo Padrao" };
            //adiciona um novo curso com um novo professor em aluno.cursos
            novoAluno.Cursos.Add(new Curso() { CursoNome = "Novo Curso para o aluno", Professor = new Professor() { ProfessorNome = "Novo Professor - Aula 22" } });
            using (var context = new EscolaDBEntities())
            {
                //adiciona o aluno ao contexto
                context.Alunos.Add(novoAluno);
                //persiste o grafo de entidades
                context.SaveChanges();
                //exibe os resultados 
                Console.WriteLine("Uma entidade aluno (novoAluno) foi adiciona com um AlunoId  =  " + novoAluno.AlunoId.ToString());
                Console.WriteLine("Uma nova entidade Padrao foi adicionada com PadraoId         =  " + novoAluno.PadraoId.ToString());
                Console.WriteLine("Uma nova entidade Curso foi adicionada com CursoId             =  " + novoAluno.Cursos.ElementAt(0).CursoId.ToString());
                Console.WriteLine("Uma nova entidade Professor foi adicionada com ProfessorId   =  " + novoAluno.Cursos.ElementAt(0).ProfessorId.ToString());
                Console.ReadKey();
            }
        }
    }
}

A seguir, temos a sequência das operações realizadas:

  1. Criamos uma nova entidade Aluno chamada novoAluno;
  2. Atribuímos um novo padrão à nova entidade;
  3. Adicionamos um novo curso com um novo professor ;
  4. Usamos o método Add() para adicionar a nova entidade ao contexto;
  5. Persistimos as alterações usando o método SaveChanges().

Executando o projeto iremos obter o seguinte resultado:

ef_curb222

Dessa forma, notamos que não existe diferença quando você adiciona uma entidade simples ou um grafo de entidades no cenário conectado ou desconectado.

Você deve apenas verificar se todas as entidades são novas e se os campos obrigatórios estão sendo criados.

Na próxima aula veremos como atualizar um grafo de entidades usando o DBContext no cenário desconectado.