Tutorial: Personalizar el comportamiento de inserción, actualización y eliminación de las clases de entidad
Publicado: abril de 2016
El Object Relational Designer proporciona una superficie de diseño visual para crear y editar las clases de LINQ to SQL (clases de entidad) basadas en los objetos de una base de datos.Mediante LINQ a SQL, puede usar la tecnología LINQ para obtener acceso a las bases de datos SQL.Para obtener más información, consulte LINQ (Language-Integrated Query).
El motor en tiempo de ejecución LINQ to SQL proporciona, de forma predeterminada, la lógica para realizar actualizaciones.El motor en tiempo de ejecución crea las instrucciones predeterminadas de inserción, actualización y eliminación basándose en el esquema de la tabla (definiciones de columna e 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 obtener más información, vea Personalizar las operaciones mediante procedimientos almacenados exclusivamente.
Nota
Este tutorial requiere la disponibilidad de los procedimientos almacenados InsertCustomer, UpdateCustomer y DeleteCustomer para la base de datos Northwind.Para obtener información detallada sobre cómo crear estos procedimientos almacenados, vea Tutorial: Crear procedimientos almacenados de actualización para la tabla Customers de Northwind.
En este tutorial se proporcionan los pasos que se deben seguir para invalidar el comportamiento predeterminado del motor en tiempo de ejecución LINQ to SQL y volver a guardar los datos en una base de datos mediante procedimientos almacenados.
En 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 Windows Forms con un control DataGridView enlazado a la clase Customer.
Implementar la funcionalidad de guardar para el formulario.
Crear los métodos de DataContext agregando procedimientos almacenados al Object Relational Designer.
Configurar la clase Customer de modo que se usen los procedimientos almacenados para realizar inserciones, actualizaciones y eliminaciones.
Requisitos previos
Para realizar este tutorial, necesita lo siguiente:
Tener acceso a la versión de SQL Server de la base de datos de ejemplo Northwind.Para obtener más información, consulte Cómo: Instalar bases de datos de ejemplo.
Los procedimientos almacenados InsertCustomer, UpdateCustomer y DeleteCustomer para la base de datos Northwind.Para obtener más información, consulte Tutorial: Crear procedimientos almacenados de actualización para la tabla Customers de Northwind.
Crear una aplicación y agregar clases de LINQ to SQL
Dado que va a trabajar con clases de LINQ to SQL y mostrar los datos en un Windows Form, cree una nueva aplicación de Windows Forms y agregue un archivo de clases de LINQ to SQL.
Nota
Es posible que tu equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice determinan estos elementos. Para obtener más información, vea Personalizar el IDE.
Para crear un nuevo proyecto de aplicación para Windows con clases de LINQ to SQL
Desde el menú Archivo, cree un proyecto nuevo.
Asigne al proyecto el nombre UpdatingwithSProcsWalkthrough.
Nota
Se admite el Object Relational Designer en los proyectos de Visual Basic y de C#.Por consiguiente, cree el nuevo proyecto en uno de estos lenguajes.
Haga clic en la plantilla Aplicación de Windows Forms y en Aceptar.Para obtener más información, vea Aplicaciones cliente.
Se crea el proyecto UpdatingwithSProcsWalkthrough y se agrega al Explorador de soluciones.
En el menú Proyecto, haga clic en Agregar nuevo elemento.
Haga clic en la plantilla Clases de LINQ to SQL y escriba Northwind.dbml en el cuadro Nombre.
Haga clic en Agregar.
Se agrega al proyecto un archivo de clases de LINQ to SQL vacío (Northwind.dbml) y se abre el Object Relational Designer.
Crear la clase de entidad Customer y el origen de datos de objeto
Cree las clases de LINQ to SQL que están asignadas a las tablas de base de datos arrastrando las tablas del Explorador de servidores/Explorador de bases de datos al 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
En el Explorador de servidores/Explorador de bases de datos, busque la tabla Customer en la versión de SQL Server de la base de datos de ejemplo Northwind.Para obtener más información, vea Cómo: Conectar con la base de datos Northwind.
Arrastre el nodo Customers del Explorador de servidores/Explorador de bases de datos hasta la superficie del 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 Opciones (Cuadro de diálogo).Para obtener más información, vea Cómo: Activar y desactivar la pluralización (Object Relational Designer).
En el menú Compilar, haga clic en Generar UpdatingwithSProcsWalkthrough para crear el proyecto.
En el menú Datos, haga clic en Mostrar orígenes de datos.
En la ventana Orígenes de datos, seleccione Agregar nuevo origen de datos.
Haga clic en Objeto en la página Elegir un tipo de origen de datos y, a continuación, haga clic en Siguiente.
Expanda el nodo UpdatingwithSProcsWalkthrough y, a continuación, 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.
Haga clic en Finalizar para crear el origen de datos y agregar la clase de entidad Customer a la ventana Orígenes de datos.
Crear un control DataGridView para mostrar los datos del cliente en un formulario 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 Windows Forms.
Para agregar controles enlazados a las clases de entidad
Abra Form1 en la vista Diseño.
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.
Abra Form1 en el Editor de código.
Agregue al formulario el código siguiente, global para el formulario, fuera de cualquier método concreto, pero dentro de la clase Form1:
Private NorthwindDataContext1 As New NorthwindDataContext
private NorthwindDataContext northwindDataContext1 = new NorthwindDataContext();
Cree un controlador de eventos para el evento
Form_Load
y agregue el código siguiente al controlador:CustomerBindingSource.DataSource = NorthwindDataContext1.Customers
customerBindingSource.DataSource = northwindDataContext1.Customers;
Implementar la funcionalidad de guardar
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 guardar para los objetos de LINQ to SQL.
Para implementar la funcionalidad de guardar
Abra Form1 en la vista Diseño.
Seleccione el botón Guardar en CustomersBindingNavigator (el botón con el icono del disquete).
En la ventana Propiedades, establezca la propiedad Enabled en True.
Haga doble clic en el botón Guardar para crear un controlador de eventos y cambiar al Editor de código.
Agregue el código siguiente al controlador de eventos del botón Guardar.
NorthwindDataContext1.SubmitChanges ()
northwindDataContext1.SubmitChanges();
Invalidar el comportamiento predeterminado para realizar actualizaciones (inserciones, actualizaciones y eliminaciones)
Para invalidar el comportamiento de actualización predeterminado
Abra el archivo de LINQ to SQL en el Object Relational Designer.(Haga doble clic en el archivo Northwind.dbml en el Explorador de soluciones.)
En el Explorador de servidores/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.
Arrastre los tres procedimientos almacenados al 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 DataContext (Object Relational Designer).
Seleccione la clase de entidad Customer en el Object Relational Designer.
En la ventana Propiedades, seleccione la propiedad Insertar.
Haga clic en los puntos suspensivos (...) junto a Usar motor en tiempo de ejecución para abrir el cuadro de diálogo Configurar comportamiento.
Seleccione Personalizar.
Seleccione el método InsertCustomers en la lista Personalizar.
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, aparecerá un cuadro de diálogo de advertencia en el que podrá aplicar los cambios.
Seleccione Actualizar en la lista Comportamiento.
Seleccione Personalizar.
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.
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).
Haga clic en Aplicar para guardar la configuración de la clase y el comportamiento seleccionados.
Seleccione Eliminar en la lista Comportamiento.
Seleccione Personalizar.
Seleccione el método DeleteCustomers en la lista Personalizar.
Asigne el argumento de método Original_CustomerID a la propiedad de clase CustomerID (Original).
Haga clic en Aceptar.
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 (GUID generado por la base de datos) y columnas de 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, debería establecer manualmente IsDbGenerated en true
, y AutoSync en una de las siguientes opciones: Always, OnInsert o OnUpdate.
Probar 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.
Para probar la aplicación
Presione F5.
Modifique un registro en la cuadrícula para probar el comportamiento de actualización.
Agregue un nuevo registro para probar el comportamiento de inserción.
Haga clic en el botón Guardar para volver a guardar los cambios en la base de datos.
Cierre el formulario.
Presione F5 y compruebe que se conservan el registro actualizado y el registro que se acaba de insertar.
Elimine el nuevo registro creado en el paso 3 para probar el comportamiento de eliminación.
Haga clic en el botón Guardar para enviar los cambios y quitar el registro eliminado de la base de datos
Cierre el formulario.
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.Para obtener más información, vea Cómo: Administrar archivos de datos locales en los proyectos.
Pasos siguientes
Dependiendo de los requisitos de la aplicación, hay varios pasos que se pueden dar después de crear las clases de entidad de LINQ to SQL.A continuación, se indican algunas de las mejoras que podría realizar en esta aplicación:
Implementar la comprobación de simultaneidad durante las actualizaciones.Para obtener más información, vea Simultaneidad optimista: Información general.
Agregar consultas LINQ para filtrar los datos.Para obtener más información, vea Introduction to LINQ Queries (C#).
Vea también
Object Relational Designer
LINQ a SQL
Consultas en LINQ to SQL
Métodos DataContext (Object Relational Designer)
Cómo: Asignar procedimientos almacenados para realizar actualizaciones, inserciones y eliminaciones (Object Relational Designer)
PAVE What's New for Data Application Development in Visual Studio 2012