Procedimientos almacenados CUD del diseñador

En este tutorial paso a paso se explica cómo asignar las operaciones crear\insertar, actualizar y eliminar (CUD, por sus siglas en inglés) de un tipo de entidad a procedimientos almacenados en Entity Framework Designer (EF Designer).  De forma predeterminada, Entity Framework genera automáticamente las instrucciones SQL para las operaciones CUD, pero también puede asignar procedimientos almacenados a estas operaciones.  

Tenga en cuenta que Code First no admite la asignación a procedimientos almacenados ni funciones. Sin embargo, puede llamar a procedimientos almacenados o funciones con el método System.Data.Entity.DbSet.SqlQuery. Por ejemplo:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]");

Aspectos que deben tenerse en cuenta cuando se asignan operaciones CUD a procedimientos almacenados

Cuando se asignan operaciones CUD a procedimientos almacenados, deben tenerse en cuenta los siguientes aspectos:

  • Si va a asignar una de las operaciones CUD a un procedimiento almacenado, asígnelas todas. Si no asigna las tres, las operaciones no asignadas darán error al ejecutarlas y se producirá una excepción UpdateException.
  • Debe asignar todos los parámetros del procedimiento almacenado a las propiedades de la entidad.
  • Si el servidor genera el valor de clave principal para la fila insertada, debe volver a asignar este valor a la propiedad de clave de la entidad. En el siguiente ejemplo, el procedimiento almacenado InsertPerson devuelve la clave principal recién creada como parte del conjunto de resultados del procedimiento almacenado. La clave principal se asigna a la clave de la entidad (PersonID) utilizando la característica <Agregar enlace de resultados> de EF Designer.
  • Las llamadas a procedimientos almacenados se asignan 1:1 con las entidades del modelo conceptual. Por ejemplo, si implementa una jerarquía de herencia en el modelo conceptual y, a continuación, asigna los procedimientos almacenados CUD para las entidades Parent (base) y Child (derivada), si guarda los cambios de Child solo se llama a los procedimientos almacenados de Child, no desencadena llamadas a los procedimientos almacenados de Parent.

Requisitos previos

Para completar este tutorial, necesitará:

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 CUDSProcsSample como nombre.
  • Seleccione Aceptar.

Creación de un modelo

  • Haga clic con el botón derecho en el nombre del proyecto 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 CUDSProcs.edmx como nombre de archivo y haga clic en Agregar.

  • En el cuadro de diálogo Elegir contenido del modelo, seleccione Generar desde la base de datos y 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, escribaSchool 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, en el nodo Tablas, seleccione la tabla Person.

  • Seleccione también los siguientes procedimientos almacenados en el nodo Funciones y procedimientos almacenados: DeletePerson, InsertPerson y UpdatePerson.

  • 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. Dado que en este ejemplo tenemos procedimientos almacenados que insertan, actualizan y eliminan tipos de entidad, no queremos importarlos y desactivamos esta casilla.

    Import S Procs

  • Haga clic en Finalizar Se muestra EF Designer, que proporciona una superficie de diseño para editar el modelo.

Asignación de la entidad Person a procedimientos almacenados

  • Haga clic con el botón derecho en el tipo de entidad Person y seleccione Asignación de procedimientos almacenados.

  • Las asignaciones de procedimientos almacenados aparecen en la ventana Detalles de la asignación.

  • Haga clic en <Seleccionar funciones de inserción>. El campo se convierte en una lista desplegable de los procedimientos almacenados del modelo de almacenamiento que se puede asignar a tipos de entidad del modelo conceptual. Seleccione InsertPerson en la lista desplegable.

  • Aparecen las asignaciones predeterminadas entre los parámetros de procedimiento almacenado y las propiedades de entidad. Observe que las flechas indican la dirección de la asignación: se proporcionan valores de propiedad como parámetros de procedimiento almacenado.

  • Haga clic en <Agregar enlace de resultados>.

  • Escriba NewPersonID, el nombre del parámetro devuelto por el procedimiento almacenado InsertPerson. Asegúrese de no dejar espacios iniciales ni finales.

  • Presione ENTRAR.

  • De forma predeterminada, NewPersonID se asigna a la clave de entidad PersonID. Observe que una flecha indica la dirección de la asignación: el valor de la columna de resultado se proporciona para la propiedad.

    Mapping Details

  • Haga clic en <Seleccionar función de actualización> y seleccione UpdatePerson en la lista desplegable.

  • Aparecen las asignaciones predeterminadas entre los parámetros de procedimiento almacenado y las propiedades de entidad.

  • Haga clic en <Seleccionar función de eliminación> y seleccione DeletePerson en la lista desplegable.

  • Aparecen las asignaciones predeterminadas entre los parámetros de procedimiento almacenado y las propiedades de entidad.

Las operaciones de inserción, actualización y eliminación de un tipo de entidad Person están asignadas ahora a procedimientos almacenados.

Si desea habilitar la comprobación de simultaneidad al actualizar o eliminar una entidad con procedimientos almacenados, use una de las siguientes opciones:

  • Use un parámetro OUTPUT para devolver el número de filas afectadas del procedimiento almacenado y seleccione la casilla Parámetro de filas afectadas junto al nombre del parámetro. Si el valor devuelto es cero cuando se llama a la operación, se produce una excepción OptimisticConcurrencyException.
  • Seleccione la casilla Usar valor original junto a una propiedad que quiera usar para la comprobación de simultaneidad. Cuando se intenta una actualización, se usa el valor de la propiedad que se leyó originalmente de la base de datos cuando se vuelven a escribir los datos en la base de datos. Si el valor no coincide con el valor de la base de datos, se produce una excepción OptimisticConcurrencyException.

Uso del modelo

Abra el archivo Program.cs donde está definido el método Main. Agregue el siguiente código a la función Main.

El código crea un nuevo objeto Person, lo actualiza y, finalmente, lo elimina.

    using (var context = new SchoolEntities())
    {
        var newInstructor = new Person
        {
            FirstName = "Robyn",
            LastName = "Martin",
            HireDate = DateTime.Now,
            Discriminator = "Instructor"
        }

        // Add the new object to the context.
        context.People.Add(newInstructor);

        Console.WriteLine("Added {0} {1} to the context.",
            newInstructor.FirstName, newInstructor.LastName);

        Console.WriteLine("Before SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // SaveChanges will call the InsertPerson sproc.  
        // The PersonID property will be assigned the value
        // returned by the sproc.
        context.SaveChanges();

        Console.WriteLine("After SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // Modify the object and call SaveChanges.
        // This time, the UpdatePerson will be called.
        newInstructor.FirstName = "Rachel";
        context.SaveChanges();

        // Remove the object from the context and call SaveChanges.
        // The DeletePerson sproc will be called.
        context.People.Remove(newInstructor);
        context.SaveChanges();

        Person deletedInstructor = context.People.
            Where(p => p.PersonID == newInstructor.PersonID).
            FirstOrDefault();

        if (deletedInstructor == null)
            Console.WriteLine("A person with PersonID {0} was deleted.",
                newInstructor.PersonID);
    }
  • Compile y ejecute la aplicación. El programa produce el siguiente resultado*:

Nota:

El servidor genera PersonID automáticamente, por lo que es más que probable que vea un número diferente*.

Added Robyn Martin to the context.
Before SaveChanges, the PersonID is: 0
After SaveChanges, the PersonID is: 51
A person with PersonID 51 was deleted.

Si está trabajando con la versión Ultimate de Visual Studio, puede usar Intellitrace con el depurador para ver las instrucciones SQL que se ejecutan.

Debug With Intellitrace