Tutorial: Personalización del comportamiento de inserción, actualización y eliminación de las clases de entidades

Nota:

Los conjuntos de datos y las clases relacionadas son tecnologías heredadas de .NET Framework de principios de la década de 2000 que permiten a las aplicaciones trabajar con datos en memoria mientras están desconectadas de la base de datos. Son especialmente útiles para las aplicaciones que permiten a los usuarios modificar los datos y conservar los cambios en la base de datos. Aunque los conjuntos de datos han demostrado ser una tecnología de gran éxito, se recomienda que las nuevas aplicaciones de .NET usen Entity Framework Core. Entity Framework proporciona una manera más natural de trabajar con datos tabulares como modelos de objetos y tiene una interfaz de programación más sencilla.

Las herramientas LINQ to SQL de Visual Studio proporcionan una superficie visual de diseño para crear y editar clases LINQ to SQL (clases de entidad) basadas en objetos de una base de datos. Mediante LINQ to SQL, puede usar la tecnología LINQ para obtener acceso a las bases de datos SQL. Para más información, vea LINQ (Language Integrated Query).

El entorno de ejecución de LINQ to SQL proporciona, de forma predeterminada, la lógica para realizar actualizaciones. El entorno de ejecución crea las instrucciones Insert, Update y Delete predeterminadas según el esquema de la tabla (las definiciones de columna y la información de la clave principal). Cuando no se desea usar el comportamiento predeterminado, se puede configurar el comportamiento de actualización y designar procedimientos almacenados concretos para realizar las inserciones, actualizaciones y eliminaciones necesarias para poder trabajar con los datos de la base de datos. También se puede realizar esta acción cuando no se genera el comportamiento predeterminado, por ejemplo, cuando las clases de entidad se asignan a vistas. Además, se puede invalidar el comportamiento de actualización predeterminado cuando la base de datos requiere el acceso a las tablas a través de procedimientos almacenados. Para más información, consulte Personalización de operaciones utilizando procedimientos almacenados .

Nota

Este tutorial requiere la disponibilidad de los procedimientos almacenados InsertCustomer, UpdateCustomer y DeleteCustomer para la base de datos Northwind.

En este tutorial se proporcionan los pasos que se deben seguir para invalidar el comportamiento predeterminado del entorno de ejecución de LINQ to SQL y volver a guardar los datos en una base de datos mediante procedimientos almacenados.

Durante este tutorial, aprenderá a realizar las siguientes tareas:

  • Crear una nueva aplicación de Windows Forms y agregarle un archivo de LINQ to SQL.

  • Crear una clase de entidad asignada a la tabla Customers de Northwind.

  • Crear un origen de datos de objeto que haga referencia a la clase Customer de LINQ to SQL.

  • Crear un formulario de Windows Forms que contenga un elemento DataGridView enlazado a la clase Customer.

  • Implementar la funcionalidad de guardar para el formulario.

  • Cree métodos DataContext agregando procedimientos almacenados a Object Relational Designer.

  • Configure la clase Customer para que se usen procedimientos almacenados para realizar inserciones, actualizaciones y eliminaciones.

Requisitos previos

En este tutorial se usa LocalDB de SQL Server Express y la base de datos de ejemplo Northwind.

  1. Si no tiene LocalDB de SQL Server Express, instálelo desde la página de descarga de SQL Server Express, o bien mediante el Instalador de Visual Studio. En el Instalador de Visual Studio, puede instalar LocalDB de SQL Server Express como parte de la carga de trabajo Almacenamiento y procesamiento de datos, o bien como un componente individual.

  2. Siga estos pasos para instalar la base de datos de ejemplo Northwind:

    1. En Visual Studio, abra la ventana Explorador de objetos de SQL Server. (El Explorador de objetos de SQL Server se instala como parte de la carga de trabajo Almacenamiento y procesamiento de datos del Instalador de Visual Studio). Expanda el nodo SQL Server. Haga clic con el botón derecho en la instancia de LocalDB y seleccione Nueva consulta.

      Se abre una ventana del editor de consultas.

    2. Copie el script de Transact-SQL Northwind en el Portapapeles. Este script de T-SQL crea la base de datos Northwind desde cero y la rellena con datos.

    3. Pegue el script de T-SQL en el editor de consultas y, después, elija el botón Ejecutar.

      Después de un breve tiempo, la consulta termina de ejecutarse y se crea la base de datos Northwind.

Creación de una aplicación y adición de clases de LINQ to SQL

Dado que va a trabajar con clases de LINQ to SQL y mostrar los datos en un formulario de Windows Forms, cree una nueva aplicación de Windows Forms y agregue un archivo de clases LINQ to SQL.

Nota

Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en este artículo. Puede que esté usando una edición diferente de Visual Studio u otra configuración del entorno. Para obtener más información, vea Personalizar el IDE.

Creación de un nuevo proyecto de aplicación para Windows Forms con clases LINQ to SQL

  1. En Visual Studio, en el menú Archivo, seleccione Nuevo>Proyecto.

  2. Expanda Visual C# o Visual Basic en el panel de la izquierda y, a continuación, seleccione Escritorio de Windows.

  3. En el panel central, seleccione el tipo de proyecto Aplicación de Windows Forms.

  4. Asigne al proyecto el nombre UpdatingwithSProcsWalkthrough y, luego, elija Aceptar.

    Se crea el proyecto UpdatingwithSProcsWalkthrough y se agrega al Explorador de soluciones.

  5. En el menú Proyecto , haga clic en Agregar nuevo elemento.

  6. Haga clic en la plantilla Clases de LINQ to SQL y escriba Northwind.dbml en el cuadro Nombre.

  7. Haga clic en Agregar.

    Se agrega al proyecto un archivo de clases LINQ to SQL vacío (Northwind.dbml) y se abre Object Relational Designer.

Creación de la clase de entidad "Cliente" y el origen de datos de objeto

Cree clases LINQ to SQL que se asignen a tablas de base de datos arrastrando tablas desde el Explorador de servidores o el Explorador de bases de datos a Object Relational Designer. El resultado serán las clases de entidad de LINQ to SQL que se asignan a las tablas en la base de datos. Después de crear las clases de entidad, éstas se pueden usar como orígenes de datos de objeto igual que cualquier otra clase que tenga propiedades públicas.

Para crear una clase de entidad Customer y configurar con ella un origen de datos

  1. En el Explorador de servidores o el Explorador de bases de datos, busque la tabla Cliente en la versión de SQL Server de la base de datos de ejemplo Northwind.

  2. Arrastre el nodo Clientes desde el Explorador de servidores o el Explorador de bases de datos hasta la superficie de *Object Relational Designer.

    Se crea una clase de entidad denominada Customer. Dicha clase tiene propiedades que corresponden a las columnas de la tabla Customers. La clase de entidad se denomina Customer (no Customers) porque representa a un único cliente de la tabla Customers.

    Nota

    Este comportamiento de cambio de nombre se denomina pluralización. Se puede activar o desactivar en el cuadro de diálogo Opciones. Para más información, consulte Activación y desactivación de la pluralización (Object Relational Designer).

  3. En el menú Compilar, haga clic en Generar UpdatingwithSProcsWalkthrough para crear el proyecto.

  4. Para abrir la ventana Orígenes de datos, haga clic en Mostrar orígenes de datos en el menú Datos.

  5. En la ventana Orígenes de datos , seleccione Agregar nuevo origen de datos.

  6. Haga clic en Objeto en la página Elegir un tipo de origen de datos y después haga clic en Siguiente.

  7. Expanda el nodo UpdatingwithSProcsWalkthrough y, después, busque y seleccione la clase Customer.

    Nota

    Si la clase Customer no está disponible, cierre el asistente, compile el proyecto y vuelva a ejecutar el asistente.

  8. Haga clic en Finalizar para crear el origen de datos y agregar la clase de entidad Customer a la ventana Orígenes de datos.

Creación de un objeto DataGridView para mostrar los datos del cliente en un formulario de Windows Forms

Cree los controles enlazados a las clases de entidad arrastrando los elementos de origen de datos de LINQ to SQL desde la ventana Orígenes de datos hasta un formulario de Windows Forms.

Para agregar controles enlazados a las clases de entidad

  1. Abra Form1 en la vista Diseño.

  2. Desde la ventana Orígenes de datos, arrastre el nodo Customer hasta Form1.

    Nota

    Para mostrar la ventana Orígenes de datos, haga clic en Mostrar orígenes de datos en el menú Datos.

  3. Abra Form1 en el Editor de código.

  4. Agregue al formulario el código siguiente, global para el formulario, fuera de cualquier método concreto, pero dentro de la clase Form1:

    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. Cree un controlador de eventos para el evento Form_Load y agregue el código siguiente al controlador:

    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

Implementación de la funcionalidad de guardado

De forma predeterminada, el botón Guardar no está habilitado y la funcionalidad de guardar no está implementada. Además, no se agrega automáticamente código para guardar los datos modificados en la base de datos cuando se crean controles enlazados a datos para los orígenes de datos de objeto. En esta sección se explica cómo habilitar el botón Guardar e implementar la funcionalidad de guardado para los objetos LINQ to SQL.

Para implementar la funcionalidad de guardar

  1. Abra Form1 en la vista Diseño.

  2. Seleccione el botón Guardar en CustomersBindingNavigator (el botón con el icono del disquete).

  3. En la ventana Propiedades, establezca la propiedad Enabled en True.

  4. Haga doble clic en el botón Guardar para crear un controlador de eventos y cambiar al Editor de código.

  5. Agregue el código siguiente al controlador de eventos del botón Guardar:

    northwindDataContext1.SubmitChanges();
    

Invalidación del comportamiento predeterminado para realizar actualizaciones (inserciones, actualizaciones y eliminaciones)

Para invalidar el comportamiento de actualización predeterminado

  1. Abra el archivo LINQ to SQL en Object Relational Designer. Haga doble clic en el archivo Northwind.dbml en el Explorador de soluciones.

  2. En el Explorador de servidores o Explorador de bases de datos, expanda el nodo Procedimientos almacenados de las bases de datos Northwind y busque los procedimientos almacenados InsertCustomers, UpdateCustomers y DeleteCustomers.

  3. Arrastre los tres procedimientos almacenados a Object Relational Designer.

    Los procedimientos almacenados se agregan al panel de métodos como métodos de DataContext. Para obtener más información, vea Métodos de DataContext (Object Relational Designer).

  4. Seleccione la clase de entidad Cliente en Object Relational Designer.

  5. En la ventana Propiedades, seleccione la propiedad Insertar.

  6. Haga clic en los puntos suspensivos (...) junto a Usar motor en tiempo de ejecución para abrir el cuadro de diálogo Configurar comportamiento.

  7. Seleccione Personalizar.

  8. Seleccione el método InsertCustomers en la lista Personalizar.

  9. Haga clic en Aplicar para guardar la configuración de la clase y el comportamiento seleccionados.

    Nota

    Puede continuar configurando las combinaciones de clase y comportamiento haciendo clic en Aplicar después de realizar cada modificación. Si cambia la clase o el comportamiento antes de hacer clic en Aplicar, aparece un cuadro de diálogo de advertencia en el que podrá aplicar los cambios.

  10. Seleccione Actualizar en la lista Comportamiento.

  11. Seleccione Personalizar.

  12. Seleccione el método UpdateCustomers en la lista Personalizar.

    Examine la lista de Argumentos de método y Propiedades de clase, y observe que hay dos argumentos de método y dos propiedades de clase para algunas columnas de la tabla. De esta manera, resulta más fácil realizar un seguimiento de los cambios y crear instrucciones que comprueben las infracciones de simultaneidad.

  13. Asigne el argumento de método Original_CustomerID a la propiedad de clase CustomerID (Original).

    Nota

    De forma predeterminada, los argumentos de método se asignarán a las propiedades de clase cuando los nombres coincidan. Si se modifican los nombres de propiedad y ya no hay coincidencia entre la tabla y la clase de entidad, puede que tenga que seleccionar la propiedad de clase equivalente para la asignación si el Object Relational Designer no puede determinar la asignación correcta. Además, si los argumentos de método no tienen propiedades de clase válidas a las que asignarse, puede establecer el valor de Propiedades de clase en (Ninguno).

  14. Haga clic en Aplicar para guardar la configuración de la clase y el comportamiento seleccionados.

  15. Seleccione Eliminar en la lista Comportamiento.

  16. Seleccione Personalizar.

  17. Seleccione el método DeleteCustomers en la lista Personalizar.

  18. Asigne el argumento de método Original_CustomerID a la propiedad de clase CustomerID (Original).

  19. Haga clic en OK.

Nota:

Aunque no es un asunto de este tutorial particular, vale la pena observar que LINQ to SQL procesa los valores generados por la base de datos automáticamente para las columnas identidad (incremento automático), rowguidcol (identificador único global (GUID) generado por la base de datos) y marca de tiempo durante las inserciones y actualizaciones. Los valores generados por la base de datos de otros tipos de columna producirán inesperadamente un valor nulo. Para devolver los valores generados por la base de datos, debe establecer IsDbGenerated manualmente en truetrueAutoSync y en uno de los valores siguientes: AutoSync.Always, AutoSync.OnInsert o AutoSync.OnUpdate.

Prueba de la aplicación

Vuelva a ejecutar la aplicación para comprobar que el procedimiento almacenado UpdateCustomers actualiza correctamente el registro de cliente en la base de datos.

  1. Presione F5.

  2. Modifique un registro en la cuadrícula para probar el comportamiento de actualización.

  3. Agregue un nuevo registro para probar el comportamiento de inserción.

  4. Haga clic en el botón Guardar para volver a guardar los cambios en la base de datos.

  5. Cierre el formulario.

  6. Presione F5 y compruebe que se conservan el registro actualizado y el registro que se acaba de insertar.

  7. Elimine el nuevo registro creado en el paso 3 para probar el comportamiento de eliminación.

  8. Haga clic en el botón Guardar para enviar los cambios y quitar el registro eliminado de la base de datos.

  9. Cierre el formulario.

  10. Presione F5 y compruebe que el registro eliminado se quitó de la base de datos.

    Nota:

    Si la aplicación usa SQL Server Express Edition, dependiendo del valor de la propiedad Copiar en el directorio de resultados del archivo de base de datos, puede que los cambios no aparezcan al presionar F5 en el paso 10.

Pasos siguientes

Dependiendo de los requisitos de la aplicación, hay varios pasos que se pueden realizar después de crear las clases de entidad LINQ to SQL. Entre las mejoras que podría realizar a esta aplicación se incluyen: