Back-End

14 jan, 2016

Curso Entity Framework – Usando Stored Procedures

Publicidade

Nesta aula, vou mostrar como podemos usar stored procedures com o Entity Framework (aula anterior).

O Entity Framework possui a habilidade de automaticamente construir nativamente comandos para o banco de dados baseado em suas consultas LINQ to Entities ou Entity SQL, bem como construir os comandos para incluir, atualizar ou deletar dados. No entanto, você pode querer sobrescrever esses passos e usar suas stores procedures pré-definidas.

Para isso, você pode usar storeds procedures para obter dados ou para incluir, atualizar e deletar registros de uma ou múltiplas tabelas.

As stored procedures e as user-defined functions (UDFs) no banco de dados são representadas como funções no Entity Framework (atualmente, o EF não possui nenhuma entidade para stored procedures no descritor EDM).

Vamos então incluir no banco de dados EscolaDB.mdf criado na aula 2 do curso.

Abra o banco de dados e clique com o botão direito sobre o item Stored Procedures e a seguir em New Stored Procedure.

Em seguida, o código abaixo que cria a stored procedure GetCursosPorAlunoId, que retorna os cursos pelo código do aluno:

ef_1

A seguir, como já criamos o EDM nas aulas anteriores, temos que atualizar o nosso modelo de entidades incluindo a stored procedure que acabamos de criar no EDM.

Abra o EDM na solução EF6_EscolaDB e em seguida clique com o botão direito do mouse no interior do descritor e depois em Update Model from database.

No janela do assistente, marque o item Stored Procedures and Functions e clique no botão Finish.

ef_2

Se visualizarmos o Model Browser, iremos visualizar a nossa stored procedure em Entity Types -> Complex Types:

ef_3

Sempre que importamos uma stored procedure para o modelo, ele cria um novo tipo complexo com o nome: {nome_da_stored_procedure}_Result por padrão.

A stored procedure GetCursosPorAlunoId irá retornar os mesmos campos da entidade Curso.

Precisamos então atualizar o tipo de retorno da stored procedure para retornar um tipo da entidade Curso.

Abra o Model Browser e em Function Imports clique com o botão direito sobre GetCursosPorAlunoId e, a seguir, em Edit.

Clique no radiobutton Entities, selecione a entidade Curso e clique no botão OK:

ef_4

Pronto! já podemos usar a nossa stored procedure.

Preparando o ambiente

Vamos usar a solução criada na aula 11 – Entity Framework – Consultas Projeção – EF6_EscolaDB – para testar o cenário da concorrência descrito acima.

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

ef_5

Para referenciar o EF no projeto incluído, no menu TOOLS clique em Nuget Package Manager -> Manage Nuget Packages for solution.

A seguir, clique em Installed packages e depois no botão Manage e marque o projeto que incluímos; a seguir, clique no botão OK.

ef_6

Em seguida, 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:

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

Testando a Stored Procedure

A seguir, no método Main() do arquivo Program.cs, inclua o código abaixo:

using System;
using EF6_EscolaDB;

namespace EF6_StoredProcedure
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new EscolaDBEntities())
            {
                var cursos = context.GetCursosPorAlunoId(2);

                Console.WriteLine("Cursos do Aluno de código igual a 2 - Miriam ");
                Console.WriteLine("------------------------------------------------");

                foreach (Curso cs in cursos)
                    Console.WriteLine(cs.CursoNome);

                Console.ReadKey();
            }
        }
    }
}

Executando o projeto iremos obter o seguinte resultado

ef_7

Na próxima aula, veremos como podemos usar stored procedures para fazer um CUD no Entity Framework.