Entity Framework - procedimentos armazenados

O Entity Framework permite que você use procedimentos armazenados no Entity Data Model em vez de, ou em combinação com, sua geração automática de comando.

  • Você pode usar procedimentos armazenados para executar lógica predefinida em tabelas de banco de dados, e muitas organizações têm políticas em vigor que exigem o uso desses procedimentos armazenados.

  • Ele também pode especificar que EF deve usar seus procedimentos armazenados para inserir, atualizar ou excluir entidades.

  • Embora os comandos construídos dinamicamente sejam seguros, eficientes e geralmente tão bons ou melhores do que aqueles que você mesmo escreve, há muitos casos em que já existem procedimentos armazenados e as práticas da sua empresa podem restringir o uso direto das tabelas.

  • Como alternativa, você pode apenas desejar ter controle explícito sobre o que é executado na loja e preferir criar procedimentos armazenados.

O exemplo a seguir cria um novo projeto em Arquivo → Novo → Projeto.

Step 1 - Selecione o aplicativo de console no painel do meio e insira StoredProceduresDemo no campo de nome.

Step 2 - No explorador de servidores, clique com o botão direito em seu banco de dados.

Step 3 - Selecione Nova consulta e insira o código a seguir no editor T-SQL para adicionar uma nova tabela em seu banco de dados.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = 
   OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U'))

BEGIN

   CREATE TABLE [dbo].[StudentGrade](

      [EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
      [CourseID] [int] NOT NULL,
      [StudentID] [int] NOT NULL,
      [Grade] [decimal](3, 2) NULL,

      CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED (
         [EnrollmentID] ASC
      )

      WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

   ) ON [PRIMARY]

END
GO

Step 4 - Clique com o botão direito no editor e selecione Executar.

Step 5- Clique com o botão direito em seu banco de dados e clique em atualizar. Você verá a tabela recém-adicionada em seu banco de dados.

Step 6 - No Server explorer, clique com o botão direito do mouse em seu banco de dados novamente.

Step 7 - Selecione Nova Consulta e digite o seguinte código no editor T-SQL para adicionar um procedimento armazenado em seu banco de dados, que retornará as notas dos Alunos.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = 
   OBJECT_ID(N'[dbo].[GetStudentGrades]') AND type in (N'P', N'PC'))

BEGIN

   EXEC dbo.sp_executesql @statement = N'
   CREATE PROCEDURE [dbo].[GetStudentGrades]
   @StudentID int
   AS
   SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade 
   WHERE StudentID = @StudentID
   '
END
GO

Step 8 - Clique com o botão direito no editor e selecione Executar.

Step 9- Clique com o botão direito em seu banco de dados e clique em atualizar. Você verá que um procedimento armazenado é criado em seu banco de dados.

Step 10 - Clique com o botão direito do mouse no nome do projeto no Solution Explorer e selecione Add → New Item.

Step 11 - Em seguida, selecione ADO.NET Entity Data Model no painel Templates.

Step 12 - Insira SPModel como nome e clique em Adicionar.

Step 13 - Na caixa de diálogo Choose Model Contents, selecione EF designer do banco de dados e clique em Next.

Step 14 - Selecione seu banco de dados e clique em Avançar.

Step 15 - Na caixa de diálogo Choose Your Database Objects, clique em tables, views.

Step 16 - Selecione a função GetStudentGradesForCourse localizada no nó Stored Procedures and Functions e clique em Concluir.

Step 17 - Selecione Exibir → Outras janelas → Navegador de modelo de dados de entidade e clique com o botão direito em GetStudentGrades em Importações de funções e selecione Editar.

Isso produzirá o seguinte diálogo.

Step 18 - Clique no botão de rádio Entities e selecione StudentGrade na combobox como tipo de retorno deste procedimento armazenado e clique em Ok.

Vamos dar uma olhada no código C # a seguir, no qual todas as notas serão recuperadas passando a ID do aluno como parâmetro no procedimento armazenado GetStudentGrades.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         int studentID = 22;
         var studentGrades = context.GetStudentGrades(studentID);

         foreach (var student in studentGrades) {
            Console.WriteLine("Course ID: {0}, Title: {1}, Grade: {2} ", 
               student.CourseID, student.Course.Title, student.Grade);
         }

         Console.ReadKey();

      }
   }
}

Quando o código acima for compilado e executado, você receberá a seguinte saída -

Course ID: 4022, Title: Microeconomics, Grade: 3.00
Course ID: 4041, Title: Macroeconomics, Grade: 3.50

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.