Início > Ado.Net > Entity Framework – Usando Stored Procedures

Entity Framework – Usando Stored Procedures

5 de dezembro de 2009 Deixe um comentário Go to comments

Olá pessoal,

Hoje vamos falar um pouquinho sobre Entity Framework, irei mostrar como usar procedures nos CRUD, então vamos ao que interessa.

Nos artigos anteriores, eu mostrei como criar um CRUD genérico utilizando o Entity Framework, bom se ver os artigos anteriores irá perceber que estamos deixando o Entity gerar as consultas T-SQL e enviar para o banco, este recurso é bem legal ainda mais porque podemos criar nossas queries e enviar para serem executadas no banco, no entanto algumas empresas isso não é permitido, ou seja, os DBA´s exigem que seja feita por uma Stored Procedure,

1-) A primeira coisa a se fazer é criar as procedures relacionadas ao CRUD de nossa aplicação, Insert, Update, Delete e Select.

2-) Bom depois vá à Data Model e adicione as stored procedures, caso seu modelo esteja criado basta dar um update model, ver imagem abaixo.

3-) Clique com o botão direito na tabela que deseja vincular as procedures e escolha a opção Table Mapping, na tela de detalhes clique na opção Map Entity to Functions

4-) Bom agora basta clicar na função e escolher a stored procedure referente à mesma. Simples não é?! Continuando, repare que neste item não possui a opção de select? Por quê? Justamente porque ele faz um Select simples de todos os campos da tabela, mas também podemos customizar isso, basta criar uma nova função.

Criando uma nova função:

-Quando criamos uma função no EF ele irá criar um método referente a ela dentro do ObjectContext, essa função pode ser qualquer Stored Procedure no Banco, imagina o seguinte, que em determinado ponto do nosso sistema queremos buscar do banco a soma de todos os produtos de uma determinada categoria, como fazer isso? Simples criamos a procedure, vinculamo-la no nosso modelo, criamos uma função e associamos esta procedure com nossa função e dizemos que ele terá um retorno do tipo especifico que queremos, e se nossa intenção fosse representar este resultado como uma entidade, como fazer isso? Também é simples basta informa que o tipo do retorno que será a entidade especifica.

Veja:

– Acesse seu modelo, e importe a respectiva stored procedure, depois basta adicionar uma nova function com o botão direito em cima do Modelo, Add/Function Imports.

Na caixa Stored procedure Name, indique o nome da procedure, no campo Function Import name, preencha com o nome da função, lembrando que este nome será o nome do método que ele irá criar, e no tipo de retorno, você pode dizer que esta função irá retornar nada (void), ou seja, apenas irá executar a procedure, se ela irá ter um retorno especifico (scalar), lembrando que scalar irá sempre retornar a primeira linha da primeira coluna, ou se o tipo será uma entidade. Para o caso de retorno de uma entidade, poderíamos criar uma entidade no nosso modelo e depois mapear ela no retorno.

Como chamar a função dentro do nosso código? Lembre-se que ele irá criar um método dentro do ObjectContext, por isso basta apenas instanciar o ObjectContext e chamar o respectivo método.

Exemplo:

using (NorthwindEntities context = new NorthwindEntities())

{

    ObjectResult<int> result = context.GetProductCountByCategoryId(1);

}

 

Os métodos Update/Delete/Insert vistos na etapa 4, estão associados aos métodos do default da entidade, por isso ao chamar o delete da entidade, ele em vez de criar o T-SQL irá utilizar a procedure (function) associada.

 

Espero que tenham gostado, duvidas podem deixar aqui no blog.

 

Abraço.

 

Categorias:Ado.Net
  1. Mário
    14 de janeiro de 2010 às 21:18

    Nelson,Boa tarde!estou trabalhando com entity,eu li seu artigo como trabalahr com procedure com entity,achei legal,porem nao me serviu,estou com uma procedure q nao retorna nada,ela apenas pega o utimo id inserido na tabela de funcionario e soma +1,eu preciso desse novo codigo,para me adicionar na tabela de funcionaio,ele me retornou uma colecao.ObjectResult<String> result = PE.SP_GerarCodigoFuncionario();recebi,so q o resultado vem em uma coleção,ai nao consigo pegar o valor numa variavel.eu verifique uma forma de pegar essa aqui pelo quickwatchele me da essa forma de pegar a o resultado.(new System.Linq.SystemCore_EnumerableDebugView<string>(result)).Items[0]so q nao consigo adicioanr a referencia,e vejo q n existe essa referencia.gostaria q me respondese se possivle pra meu emailmariojr_si@hotmail.comObrigado.

  2. Diana Cordeiro
    27 de julho de 2012 às 12:16

    Post de muita utilidade, estava realmente com dúvidas sobre procedure no EF4! Obrigada!!!

  3. Andre P Silva
    10 de outubro de 2012 às 22:49

    Nelson, criei uma função no banco de dados oracle para gerar um numero composto por uma sequence e varios outros paramentros como ano e etc.
    Porem, essa função(no caso é uma função mesmo e não uma procedure) não diz respeito a nenhuma tabela em especifico apenas do numero possivelmente ser utilizado por algumas tabelas(ou nao).
    A questao é, preciso chamar essa função atraves do Entity e nao estou conseguindo de forma alguma.
    Se puder me ajudar lhe agradecerei imensamente.
    Obrigado desde ja.

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: