Entity Framework: procedimientos almacenados

Entity Framework le permite utilizar procedimientos almacenados en Entity Data Model en lugar de, o en combinación con, su generación automática de comandos.

  • Puede utilizar procedimientos almacenados para realizar una lógica predefinida en las tablas de la base de datos, y muchas organizaciones tienen políticas que requieren el uso de estos procedimientos almacenados.

  • También puede especificar que EF debe usar sus procedimientos almacenados para insertar, actualizar o eliminar entidades.

  • Aunque los comandos construidos dinámicamente son seguros, eficientes y, en general, tan buenos o mejores que los que puede escribir usted mismo, hay muchos casos en los que ya existen procedimientos almacenados y las prácticas de su empresa pueden restringir el uso directo de las tablas.

  • Alternativamente, es posible que desee tener un control explícito sobre lo que se ejecuta en la tienda y prefiera crear procedimientos almacenados.

El siguiente ejemplo crea un nuevo proyecto desde Archivo → Nuevo → Proyecto.

Step 1 - Seleccione la Aplicación de consola en el panel central e ingrese StoredProceduresDemo en el campo de nombre.

Step 2 - En el Explorador de servidores, haga clic con el botón derecho en su base de datos.

Step 3 - Seleccione Nueva consulta e ingrese el siguiente código en el editor T-SQL para agregar una nueva tabla en su base de datos.

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 - Haga clic con el botón derecho en el editor y seleccione Ejecutar.

Step 5- Haga clic derecho en su base de datos y haga clic en actualizar. Verá la tabla recién agregada en su base de datos.

Step 6 - En el Explorador de servidores, haga clic derecho en su base de datos nuevamente.

Step 7 - Seleccione Nueva consulta e ingrese el siguiente código en el editor T-SQL para agregar un procedimiento almacenado en su base de datos, que devolverá las calificaciones del Estudiante.

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 - Haga clic con el botón derecho en el editor y seleccione Ejecutar.

Step 9- Haga clic derecho en su base de datos y haga clic en actualizar. Verá que se crea un procedimiento almacenado en su base de datos.

Step 10 - Haga clic con el botón derecho en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar → Nuevo elemento.

Step 11 - Luego, seleccione Modelo de datos de entidad ADO.NET en el panel Plantillas.

Step 12 - Ingrese SPModel como nombre y luego haga clic en Agregar.

Step 13 - En el cuadro de diálogo Elegir contenido del modelo, seleccione Diseñador EF de la base de datos y luego haga clic en Siguiente.

Step 14 - Seleccione su base de datos y haga clic en Siguiente.

Step 15 - En el cuadro de diálogo Choose Your Database Objects, haga clic en tablas, vistas.

Step 16 - Seleccione la función GetStudentGradesForCourse ubicada en el nodo Procedimientos y funciones almacenados y haga clic en Finalizar.

Step 17 - Seleccione Ver → Otras ventanas → Explorador de modelos de datos de entidades y haga clic con el botón derecho en GetStudentGrades en Importaciones de funciones y seleccione Editar.

Producirá el siguiente diálogo.

Step 18 - Haga clic en el botón de opción Entidades y seleccione StudentGrade en el cuadro combinado como tipo de retorno de este procedimiento almacenado y haga clic en Aceptar.

Echemos un vistazo al siguiente código C # en el que se recuperarán todas las calificaciones pasando la ID del estudiante como parámetro en el procedimiento almacenado 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();

      }
   }
}

Cuando se compile y ejecute el código anterior, recibirá el siguiente resultado:

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

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.