Introducción a Entity Framework 4.0 Database First y ASP.NET 4 Web Forms: parte 7

por Tom Dykstra

En la aplicación web de ejemplo Contoso University se muestra cómo crear aplicaciones ASP.NET Web Forms con Entity Framework 4.0 y Visual Studio 2010. Para obtener información sobre la serie de tutoriales, consulte el primer tutorial de la serie

Utilizar procedimientos almacenados

En el tutorial anterior, se implementó un patrón de herencia de tabla por jerarquía. En este tutorial se muestra cómo usar procedimientos almacenados para obtener más control sobre el acceso a la base de datos.

Entity Framework permite especificar que debe usar procedimientos almacenados para el acceso a la base de datos. Para cualquier tipo de entidad, puede especificar un procedimiento almacenado que se usará para crear, actualizar o eliminar entidades de ese tipo. A continuación, en el modelo de datos puede agregar referencias a procedimientos almacenados que puede usar para realizar tareas como recuperar conjuntos de entidades.

El uso de procedimientos almacenados es un requisito común para el acceso a la base de datos. En algunos casos, un administrador de bases de datos puede requerir que todo el acceso a la base de datos pase por procedimientos almacenados por motivos de seguridad. En otros casos, puede que desee crear lógica de negocios en algunos de los procesos que usa Entity Framework cuando actualiza la base de datos. Por ejemplo, cada vez que se elimina una entidad, es posible que quiera copiarla en una base de datos de archivo. O cada vez que se actualiza una fila, es posible que desee escribir una fila en una tabla de registro que registra quién realizó el cambio. Puede realizar estos tipos de tareas en un procedimiento almacenado al que se llama cada vez que Entity Framework elimina una entidad o actualiza una entidad.

Como en el tutorial anterior, no creará páginas nuevas. En su lugar, cambiará la forma en que Entity Framework accede a la base de datos para algunas de las páginas que ya ha creado.

En este tutorial creará procedimientos almacenados en la base de datos para insertar entidades Student y Instructor. Los agregará al modelo de datos y especificará que Entity Framework debe usarlos para agregar entidades Student y Instructor a la base de datos. También creará un procedimiento almacenado que puede usar para recuperar entidades Course.

Crear procedimientos almacenados en la base de datos

(Si usa el archivo School.mdf del proyecto disponible para su descarga con este tutorial, puede omitir esta sección porque los procedimientos almacenados ya existen).

En el Explorador de servidores, expanda School.mdf, haga clic con el botón derecho en Procedimientos almacenados y seleccione Agregar nuevo procedimiento almacenado.

image15

Copie las siguientes instrucciones SQL y péguelas en la ventana de procedimientos almacenados, reemplazando el procedimiento almacenado esqueleto.

CREATE PROCEDURE [dbo].[InsertStudent]
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                EnrollmentDate)
    VALUES (@LastName, 
        @FirstName, 
        @EnrollmentDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

image14

Las entidades Student tienen cuatro propiedades: PersonID, LastName, FirstName y EnrollmentDate. La base de datos genera automáticamente el valor de identificador y el procedimiento almacenado acepta parámetros para los otros tres. El procedimiento almacenado devuelve el valor de la clave de registro de la nueva fila para que Entity Framework pueda realizar un seguimiento de eso en la versión de la entidad que mantiene en la memoria.

Guarde y cierre la ventana de procedimientos almacenados.

Cree un procedimiento almacenado InsertInstructor de la misma manera, con las siguientes instrucciones SQL:

CREATE PROCEDURE [dbo].[InsertInstructor]
        @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                HireDate)
    VALUES (@LastName, 
        @FirstName, 
        @HireDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

Cree procedimientos almacenados Update también para las entidades Student y Instructor. (La base de datos ya tiene un procedimiento almacenado DeletePerson que funcionará para las entidades Instructor y Student).

CREATE PROCEDURE [dbo].[UpdateStudent]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            EnrollmentDate=@EnrollmentDate
    WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            HireDate=@HireDate
    WHERE PersonID=@PersonID;

En este tutorial asignará las tres funciones (insert, update y delete) para cada tipo de entidad. La versión 4 de Entity Framework permite asignar solo una o dos de estas funciones a procedimientos almacenados sin asignar a los demás, con una excepción: si asigna la función de actualización, pero no la función delete, Entity Framework producirá una excepción al intentar eliminar una entidad. En la versión 3.5 de Entity Framework, no tenía mucha flexibilidad en la asignación de procedimientos almacenados: si asignaba una función que tenía que asignar las tres.

Para crear un procedimiento almacenado que lea en lugar de actualizar datos, cree uno que seleccione todas las entidades Course mediante las siguientes instrucciones SQL:

CREATE PROCEDURE [dbo].[GetCourses]
            AS
            SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course

Agregar los procedimientos almacenados al modelo de datos

Los procedimientos almacenados ahora se definen en la base de datos, pero deben agregarse al modelo de datos para que estén disponibles para Entity Framework. Abra SchoolModel.edmx, haga clic con el botón derecho en la superficie de diseño y seleccione Actualizar modelo desde la base de datos. En la pestaña Agregar del cuadro de diálogo Elegir los objetos de base de datos, expanda Procedimientos almacenados, seleccione los procedimientos almacenados que acaba de crear y el procedimiento almacenado DeletePerson y, a continuación, haga clic en Finalizar.

image20

Asignación de procedimientos almacenados

En el diseñador de modelos de datos, haga clic con el botón derecho en la entidad Student y seleccione Asignación de procedimientos almacenados.

image21

Aparece la ventana Detalles de asignación, en la que puede especificar procedimientos almacenados que Entity Framework debe usar para insertar, actualizar y eliminar entidades de este tipo.

image22

Establezca la función Insert en InsertStudent. La ventana muestra una lista de parámetros de procedimiento almacenado, cada uno de los cuales debe asignarse a una propiedad de entidad. Dos de ellas se asignan automáticamente porque los nombres son los mismos. No hay ninguna propiedad de entidad denominada FirstName, por lo que debe seleccionar FirstMidName manualmente en una lista desplegable que muestre las propiedades de entidad disponibles. (Esto se debe a que cambió el nombre de la propiedad FirstName a FirstMidName en el primer tutorial).

image23

En la misma ventana Detalles de asignación, asigne la función Update al procedimiento almacenado UpdateStudent (asegúrese de especificar FirstMidName como valor de parámetro para FirstName, como hizo para el procedimiento almacenado Insert) y la función Delete al procedimiento almacenado DeletePerson.

image01

Siga el mismo procedimiento para asignar los procedimientos almacenados de inserción, actualización y eliminación de instructores a la entidad Instructor.

image02

En el caso de los procedimientos almacenados que leen en lugar de actualizar datos, use la ventana Explorador de modelos para asignar el procedimiento almacenado al tipo de entidad que devuelve. En el diseñador del modelo de datos, haga clic con el botón derecho y seleccione Explorador de modelos. Abra el nodo SchoolModel.Store y, a continuación, abra el nodo Procedimientos almacenados. A continuación, haga clic con el botón derecho en el procedimiento almacenado GetCourses y seleccione Agregar importación de funciones.

image24

En el cuadro de diálogo Agregar importación de funciones, en Devuelve una colección de seleccione Entidades y, a continuación, seleccione Course como el tipo de entidad devuelto. Cuando haya terminado, haga clic en Aceptar. Guarde y cierre el archivo .edmx.

image25

Usar los procedimientos almacenados Insert, Update y Delete

Entity Framework usa automáticamente los procedimientos almacenados para insertar, actualizar y eliminar datos después de agregarlos al modelo de datos y asignarlos a las entidades adecuadas. Ahora puede ejecutar la página StudentsAdd.aspx, y cada vez que cree un nuevo alumno, Entity Framework usará el procedimiento almacenado InsertStudent para agregar la nueva fila a la tabla Student.

image03

Ejecute la página Students.aspx y el nuevo alumno aparezca en la lista.

image04

Cambie el nombre para comprobar que funciona la función de actualización y, a continuación, elimine el alumno para comprobar que funciona la función Delete.

image05

Usar la selección de procedimientos almacenados

Entity Framework no ejecuta automáticamente procedimientos almacenados como GetCourses y no se pueden usar con el control EntityDataSource. Para usarlos, llámalos desde código.

Abra el archivo InstructorsCourses.aspx.cs. El método PopulateDropDownLists usa una consulta LINQ-to-Entities para recuperar todas las entidades del curso para que pueda recorrer en bucle la lista y determinar a qué instructor se asigna y a cuáles no se asignan:

var allCourses = (from c in context.Courses
                  select c).ToList();

Reemplace este método con el código siguiente:

var allCourses = context.GetCourses();

La página usa ahora el procedimiento almacenado GetCourses para recuperar la lista de todos los cursos. Ejecute la página para comprobar que funciona como hizo antes.

(Es posible que las propiedades de navegación de las entidades recuperadas por un procedimiento almacenado no se rellenen automáticamente con los datos relacionados con esas entidades, en función de la configuración predeterminada de ObjectContext. Para obtener más información, consulte Carga de objetos relacionados en la biblioteca de MSDN).

En el siguiente tutorial, aprenderá a usar la funcionalidad de datos dinámicos para facilitar el programa y probar las reglas de formato y validación de datos. En lugar de especificar en cada regla de página web, como cadenas de formato de datos y si se requiere o no un campo, puede especificar estas reglas en los metadatos del modelo de datos y se aplican automáticamente en cada página.