Procedimientos almacenados de consultas de Designer
En este tutorial paso a paso se muestra cómo usar Entity Framework Designer (EF Designer) para importar procedimientos almacenados en un modelo y, a continuación, llamar a los procedimientos almacenados importados para recuperar los resultados.
Tenga en cuenta que Code First no admite la asignación a funciones ni procedimientos almacenados. Sin embargo, puede llamar a funciones o procedimientos almacenados con el método System.Data.Entity.DbSet.SqlQuery. Por ejemplo:
var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;
Requisitos previos
Para completar este tutorial, necesitará:
- Una versión reciente de Visual Studio.
- La base de datos de ejemplo School.
Configuración del proyecto
- Abra Visual Studio 2012.
- Seleccione Archivo-> Nuevo -> Proyecto
- En el panel izquierdo, haga clic en Visual C# y seleccione la plantilla Consola.
- Escriba EFwithSProcsSample como nombre.
- Seleccione Aceptar.
Creación de un modelo
Haga clic con el botón derecho en el Explorador de soluciones y seleccione Agregar -> Nuevo elemento.
Seleccione Datos en el menú de la izquierda y elija Entity Data Model de ADO.NET en el panel Plantillas.
Escriba EFwithSProcsModel.edmx como nombre de archivo y haga clic en Agregar.
En el cuadro de diálogo Elegir contenido de Model, seleccione Generar desde la base de datos y, a continuación, haga clic en Siguiente.
Haga clic en Nueva conexión.
En el cuadro de diálogo Propiedades de conexión, escriba el nombre del servidor (por ejemplo, (localdb)\mssqllocaldb ), seleccione el método de autenticación, escriba School como nombre de la base de datos y haga clic en Aceptar.
El cuadro de diálogo Elegir la conexión de datos se actualiza con la configuración de la conexión de la base de datos.En el cuadro de diálogo Elija los objetos de base de datos, marque la casilla Tablas para seleccionar todas las tablas.
Seleccione también los siguientes procedimientos almacenados del nodo Procedimientos y funciones almacenados: GetStudentGrades y GetDepartmentName.A partir de Visual Studio 2012, EF Designer admite la importación masiva de procedimientos almacenados. La opción Importar procedimientos almacenados y funciones seleccionados en Entity Model está seleccionada de forma predeterminada.
Haga clic en Finalizar
De forma predeterminada, la forma del resultado de cada procedimiento almacenado o función importados que devuelva más de una columna se convertirá automáticamente en un nuevo tipo complejo. En este ejemplo queremos asignar los resultados de la función GetStudentGrades a la entidad StudentGrade y los resultados de GetDepartmentName a ninguno (ninguno es el valor predeterminado).
Para que una importación de función devuelva un tipo de entidad, las columnas devueltas por el procedimiento almacenado correspondiente deben coincidir exactamente con las propiedades escalares del tipo de entidad devuelto. Una importación de función puede devolver colecciones de tipos simples, tipos complejos o ningún valor.
- En la superficie de diseño, haga clic con el botón derecho y seleccione Explorador de modelos.
- En Explorador de modelos, seleccione Importaciones de funciones y haga doble clic en la función GetStudentGrades.
- En el cuadro de diálogo Editar importación de función, seleccione Entidades y elija StudentGrade.
La casilla La importación de función es componible en la parte superior del cuadro de diálogo Importaciones de funciones le permite asignar a funciones componibles. Si activa esta casilla, solo aparecerán funciones componibles (Funciones con valores de tabla) en la lista desplegable Procedimiento almacenado / nombre de función. Si no activa esta casilla, en la lista solo se mostrarán funciones no componibles.
Usar el modelo
Abra el archivo Program.cs en el que está definido el método Main. Agregue el siguiente código a la función Main.
El código llama a dos procedimientos almacenados: GetStudentGrades (devuelve StudentGrades para el StudentId especificado) y GetDepartmentName (devuelve el nombre del departamento en el parámetro de salida).
using (SchoolEntities context = new SchoolEntities())
{
// Specify the Student ID.
int studentId = 2;
// Call GetStudentGrades and iterate through the returned collection.
foreach (StudentGrade grade in context.GetStudentGrades(studentId))
{
Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
Console.WriteLine("Student grade: " + grade.Grade);
}
// Call GetDepartmentName.
// Declare the name variable that will contain the value returned by the output parameter.
ObjectParameter name = new ObjectParameter("Name", typeof(String));
context.GetDepartmentName(1, name);
Console.WriteLine("The department name is {0}", name.Value);
}
Compile y ejecute la aplicación. El programa produce el siguiente resultado:
StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering
Parámetros de salida
Si se usan parámetros de salida, sus valores no estarán disponibles hasta que los resultados se hayan leído completamente. Esto se debe al comportamiento subyacente de DbDataReader, consulte Recuperación de datos mediante dataReader para más detalles.