Curso Entity Framework - CRUD com Stored Procedures - XXVI


  Nesta aula vou mostrar como podemos realizar as operações CRUD (Create, Read, Update, Delete) usando stored procedures com o Entity Framework. (aula anterior)

 

Chegou o Curso ASP .NET MVC 5 Vídeo Aulas (C#)

Clique e Confira
 

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.

Na aula anterior vimos como obter dados usando uma stored procedure e nesta aula vamos usar as stored procedures para realizar as operações para criar, atualizar e deletar (CUD) registros do banco de dados usando o DbContext. Isso significa que o contexto irá executar as stored procedures ao invés de comandos DDL, usando o comando context.SaveChanges().

Para esta aula vamos criar as seguintes stored procedures:

  1. sp_InserirAluno : que inclui um novo aluno no banco de dados;

  2. sp_AtualizarAluno : que atualiza um aluno existente no banco de dados;

  3. sp_DeletaAluno : que deleta um aluno no banco de dados;

Vamos então criar essas stored procedures 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.

A seguir inclua o código abaixo para criar cada stored procedure :

1 - sp_InserirAluno

CREATE PROCEDURE [dbo].[sp_InserirAluno]
        @PadraoId int = null,
        @AlunoNome varchar
    AS
    BEGIN
        SET NOCOUNT ON;
         INSERT INTO [EscolaDB].[dbo].Aluno([AlunoNome],[PadraoId])
         VALUES(@AlunoNome, @PadraoId)
        SELECT SCOPE_IDENTITY() AS AlunoId
   END

Esta stored procedure usa o comando  SELECT SCOPE_IDENTITY() AS AlunoId que permite obter o valor do AlunoId incluído em tempo de execução.

2 - sp_AtualizarAluno

-CREATE PROCEDURE [dbo].[sp_AtualizarAluno]
        @AlunoId int,
        @PadraoId int = null,
        @AlunoNome varchar
    AS
    BEGIN
        SET NOCOUNT ON;
        Update [EscolaDB].[dbo].[Aluno] 
        set AlunoNome = @AlunoNome, PadraoId = @PadraoId
        where AlunoId = @AlunoId;
   END

3 - sp_DeletarAluno

 CREATE PROCEDURE [dbo].[sp_DeletarAluno]
        @AlunoId int
    AS
    BEGIN
        SET NOCOUNT ON;
        DELETE FROM [dbo].[Aluno]
        where AlunoId = @AlunoId
    END

Ao final do processo você deverá ver as stored procedures criadas no banco de dados conforme figura a seguir:

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

Abra o EDM na solução EF6_EscolaDB e seguir clique com o botão direito do mouse no interior do descritor e a seguir em Update Model from database;

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

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

Abra o Model Browser e clique em Stored Procedures / Functions para visualizar as stores procedures importadas:

Agora clique na entidade Aluno no descritor EDM e a seguir clique em Stored Procedure Mapping:

Na janela Mapping Details você verá as Functions : <Select Insert Function>, <Select Update Function>, e <Select Delete Function>;

Em cada Function selecione a respective stored procedure clicando e escolhendo da lista exibida:

Ao final do processo teremos o seguinte mapeamento definido para cada stored procedure:

A stored procedure sp_InserirAluno retorna o novo Id do aluno gerado na inclusão e por isso precisamos mapear o AlunoId da entidade Aluno para o código do aluno - AlunoId (Int32) da tabela Aluno:

Para concluir clique com o botão direito sobre a entidade a Aluno e a seguir clique em Validate e verifique que não tenha nenhum erro.

Pronto ! já podemos usar as nossas stored procedure criadas para realizar o CUD (Create, Update e Delete).

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

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 e a seguir no botão OK.

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


Testando a Stored Procedure

A seguir no método Main() do arquivo Program.cs inclua o código abaixo para testar cada uma das stored procedures criadas:

using System;
using EF6_EscolaDB;
namespace EF6_StoredProcedures_CRUD
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new EscolaDBEntities())
            {
                try
                {
                     context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
                    Console.WriteLine("Inserindo um novo Aluno");
                    Aluno novoAluno = new Aluno() { AlunoNome = "Novo Aluno Aula 26", PadraoId = 2 };
                    context.Alunos.Add(novoAluno);
                    //irá executar a stored procedure sp_InserirAluno
                    context.SaveChanges();
                    Console.WriteLine("Novo aluno inserido, tecle algo para alterar o nome");
                    Console.ReadKey();
                    Console.WriteLine("Alterando o nome do Aluno inserido");
                    novoAluno.AlunoNome = "Nome Alterado - Aula 26";
                    //irá executar a stored procedure sp_AlterarAluno
                    context.SaveChanges();
                    Console.WriteLine("Nome Alterado, tecle algo para excluir o aluno");
                    Console.ReadKey();
                    Console.WriteLine("Deleta Aluno - Aula 26");
                    context.Alunos.Remove(novoAluno);
                    //irá executar a stored procedure sp_DeletarAluno
                    context.SaveChanges();
                    Console.WriteLine("Aluno excluido, tecle algo para encerrar");
                    Console.ReadKey();
                }
                catch(Exception ex)
                {
                    Console.WriteLine("Erro : " + ex.Message);
                }
            }
        }
    }
}

Executando o projeto iremos obter o seguinte resultado :

Visualizando o log na janela Debug OutPut veremos a resultado da execução de cada stored procedure conforme abaixo:
 
Started transaction at 23/10/2015 11:49:14 -02:00
[dbo].[sp_InserirAluno]

-- PadraoId: '2' (Type = Int32)
-- AlunoNome: 'Novo Aluno Aula 26' (Type = AnsiString, Size = 8000)

-- Executing at 23/10/2015 11:49:15 -02:00
-- Completed in 1 ms with result: SqlDataReader

Committed transaction at 23/10/2015 11:49:15 -02:00
Closed connection at 23/10/2015 11:49:15 -02:00
Opened connection at 23/10/2015 11:49:15 -02:00
Started transaction at 23/10/2015 11:49:15 -02:00
[dbo].[sp_AtualizarAluno]
-- AlunoId: '20' (Type = Int32)
-- PadraoId: '2' (Type = Int32)
-- AlunoNome: 'Nome Alterado - Aula 26' (Type = AnsiString, Size = 8000)

-- Executing at 23/10/2015 11:49:15 -02:00
-- Completed in 2 ms with result: -1
Committed transaction at 23/10/2015 11:49:15 -02:00
Closed connection at 23/10/2015 11:49:15 -02:00
Opened connection at 23/10/2015 11:49:17 -02:00
Started transaction at 23/10/2015 11:49:17 -02:00
[dbo].[sp_DeletarAluno]

-- AlunoId: '20' (Type = Int32)

-- Executing at 23/10/2015 11:49:17 -02:00
-- Completed in 26 ms with result: -1
Committed transaction at 23/10/2015 11:49:17 -02:00
Closed connection at 23/10/2015 11:49:17 -02:00

Note que o código do aluno (AlunoId) é obtido a partir da stored procedure sp_IncluirAluno (SELECT SCOPE_IDENTITY() AS AlunoId)

Na próxima aula veremos o suporte a Enum no Entity Framework.

Todo aquele que prevarica, e não persevera na doutrina de Cristo, não tem a Deus. Quem persevera na doutrina de Cristo, esse tem tanto ao Pai como ao Filho.
2 João 1:9

 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 


             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti