Entity Framework: Usando Stored Procedures

Neste artigo será apresentado como usar Stored Procedures com o Entity Framework. Criaremos uma stored procedure pelo data model e em seguida a usaremos em uma aplicação web de exemplo.

Stored Procedures nada mais são do que instruções SQL executadas em etapas no banco de dados mantendo a lógica de negócio da aplicação dentro do próprio banco. O seu uso apresenta vantagens e desvantagens: dentre as vantagens estão o fácil acesso as mesmas por qualquer linguagem de programação sem que o programador necessite ter conhecimento de sua lógica; em contrapartida elas podem criar uma grande sobrecarga do SGBD.

Montando a Estrutura

Agora começaremos a montar nosso ambiente de desenvolvimento: primeiro precisaremos do nosso banco de dados e para isso basta executarmos o script que criará e populará o banco de dados Vendas, que terá duas tabelas. Veja o código da Listagem 1.

Listagem 1. Script SQL para criação da estrutura do banco de dados

USE [master] GO /****** Object: Database [Vendas] Script Date: 12/03/2013 20:18:11 ******/ CREATE DATABASE [Vendas] ON PRIMARY ( NAME = N'Vendas', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS \MSSQL\DATA\Vendas.mdf' , SIZE = 2304KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'Vendas_log', FILENAME = N'C:\Program Files \Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA \Vendas_log.LDF' , SIZE = 576KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO USE [Vendas] GO /****** Object: Table [dbo].[Clientes] Script Date: 12/03/2013 20:11:58 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Clientes]( [Id] [int] IDENTITY(1,1) NOT NULL, [ClienteName] [nvarchar](max) NULL, CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[Compras] Script Date: 12/03/2013 20:21:55 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Compras]( [Id] [int] IDENTITY(1,1) NOT NULL, [DataCompra] [datetime] NOT NULL, [Valor] [decimal](18, 2) NOT NULL, [ClienteId] [int] NOT NULL, CONSTRAINT [PK_Compras] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[Compras] WITH CHECK ADD CONSTRAINT [FK_Compras_Clientes_ClienteId] FOREIGN KEY([ClienteId]) REFERENCES [dbo].[Clientes] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[Compras] CHECK CONSTRAINT [FK_Compras_Clientes_ClienteId] GO INSERT INTO [Vendas].[dbo].[Clientes] ([ClienteName]) VALUES ('Josh Bailey') GO INSERT INTO [Vendas].[dbo].[Compras] ([DataCompra] ,[Valor] ,[ClienteId]) VALUES ('2013-11-29 12:57:01.357' ,5.99 ,1) GO

Executaremos esse script na instância do SQL Server instalado em nossa máquina. Em seguida, o nosso banco de dados será gerado como mostra a Figura 1.

Figura 1. Estrutura do banco de dados Vendas

Criando Stored Procedure pelo Server Explorer

Para usarmos Stored Procedures no Entity Framework, é necessário que as mesmas já estejam criadas na base de dados, só então atualizaremos o Data Model com elas. Para isso, abriremos o Visual Studio e em seguida o server Explorer, escolhendo o menu View e Server Explorer, ou ainda pressionando Ctrl + Alt + S, como mostrado na Figura 2.

Figura 2. Janela do server explorer do Visual Studio

Com o server explorer aberto, visualize a conexão com o banco de dados Vendas criado anteriormente. Caso a mesma não apareça, será necessário criá-la manualmente através do assistente, clicando com o botão direito em Data Connection e escolhendo Add Connection.

Depois da conexão criada ou visualizada, clique na seta apontando para a direita ao lado dele. Você verá uma lista de pastas associadas ao banco de dados, incluindo a pasta Stored Procedures, conforme a Figura 3.

Figura 3. Conexão ativa com o banco de dados Vendas pelo Server Explorer

Clicando com o botão direito do mouse na pasta Stored Procedures e escolhendo Add New Stored Procedure no menu de contexto, uma nova janela para a criação de Stored Procedures se apresentará. Nela coloque o código que contenha o script SQL com a lógica que a procedure conterá, como mostrado na Figura 4.

Figura 4. Script SQL para criação da Procedure pelo Visual Studio

Clicando no botão Save na barra de ferramentas, a procedure será criada na base de dados. Em seguida, para testarmos o funcionamento da mesma, basta clicar com o botão direito sobre ela e em seguida execute para que seja mostrado os resultados da Figura 5.

Figura 5. Resultado da Procedure Mostra Clientes

Criando a aplicação de exemplo

Criaremos agora o Windows Forms Application utilizando a linguagem de programação C# com o nome de TestProcedureModel, como mostrado na Figura 6.

Figura 6. Janela de criação do projeto no Visual Studio

Em seguida, criaremos o DataModel onde iremos gerar nosso modelo de dados de acordo com a estrutura do banco de dados Vendas. Para isso, basta clicarmos com o botão direito no projeto, Add, New Item ou CRTL + SHIFT + A e escolheremos ADO.NET Entity data Model. Veja o exemplo da Figura 7.

Figura 7. Janela de criação do DataModel

Preencheremos o campo name com VendasModel e em seguida clicaremos em add. Em seguida, no assistente para criação do DataModel escolheremos o Generate From Database, pois iremos gerar nosso modelo automaticamente do banco de dados criado no início deste artigo, fazendo uso da abordagem de desenvolvimento Data-Base-First. Na janela Entity Data Model Wizard preencheremos os campos de acordo com a Figura 8 para que seja criada uma conexão com o banco de dados Vendas. Na janela seguinte (Figura 9) para escolha dos Data Objects, escolheremos as tabelas Clientes e Compras e a Procedure Mostra Clientes.

Figura 8. Janela do Entity Data Model Wizard

Figura 9. Janela DataBase Objects

Com o nosso Data Model criado, abriremos novamente o Server Explorer e clicando com botão direito na procedure MostraClientes clicaremos em Open para realizarmos uma alteração no seu script para deixá-la um pouco mais robusta, como mostrado na Listagem 2.

Listagem 2. Script SQL para alteração da Procedure no Visual Studio

ALTER PROCEDURE MostraClientes @OrderBy NVarChar(20) AS SELECT * FROM Clientes AS C INNER JOIN Compras AS P ON C.Id = P.ClienteId ORDER BY CASE @OrderBy WHEN 'Data da Compra' THEN P.DataCompra WHEN 'Valor' THEN P.Valor WHEN 'ClienteId' THEN P.ClienteId ELSE P.DataCompra END

Nota: Como boa prática não se deve criar procedures que contenham apenas comandos Select, mas de preferência instruções que contenham transações.

Agora nossa Procedure está pronta para uso, agora iremos integrá-la na aplicação para ver o seu funcionamento. Abra o arquivo Form1.cs e adicione esses controles a ele:

Button (Name) btnQuery, (Text) Executar Label (Name) lblOrderBy, (Text) Ordenar por ComboBox (Name) cbOrderBy, (Text) Data da Compra

No combobox cn cbOrderBy colocaremos seus valores para seleção alterando a propriedade Itens e inserindo os valores Valor, Codigo Cliente e

Data da Compra. Em seguida, precisaremos atualizar com o arquivo aberto clicaremos com o botão direito em qualquer área vazia do modelo e escolhermos Update Model From Database para que seja aberta novamente a janela de escolha dos DataObjects, conforme a Figura 10.

Figura 10. Janela DataBase Objects

Ao marcarmos Stored Procedures, clicaremos em Finish para, em seguida, salvarmos nosso modelo. Com isso, nossa procedure estará visível a partir do Entity Framework e para finalizarmos nossa aplicação de exemplo incluiremos nossa lógica para uso da procedure no evento OnClick, como mostra a Listagem 3.

Listagem 3. Lógica do evento onClick.

private void btnQuery_Click(object sender, EventArgs e) { // Criando o contexto. VendasEntities context = new VendasEntities(); var clientesList = from clientes in context.MostraClientes(cbOrderBy.SelectedItem.ToString()) select clientes ; StringBuilder Output = new StringBuilder(); // Buscando o Resultado. foreach (var PurchaseEntry in clientesList) Output.Append( //PurchaseEntry.ClienteId + " ID " + PurchaseEntry.Clientes.ClienteName + " Cliente "+ "Valor : "+PurchaseEntry.Valor + " em " + PurchaseEntry.DataCompra); MessageBox.Show(Output.ToString()); }

Depois da lógica implementada testaremos o funcionamento da nossa aplicação clicando no botão F5 ou clicando no botão Run onde a Query executada pela procedure deverá trazer o resultado mostrado na Figura 11.

Figura 11. Resultado da execução da procedure

Neste artigo aprendemos as técnicas para implementar, usar e testar procedures com o Entity Framework pela abordagem de desenvolvimento Database-First. Não deixem de comentar e deixar sugestões para os próximos artigos. Forte abraço!

Artigos relacionados