Linq to sql 7

  • View
    83

  • Download
    2

Embed Size (px)

DESCRIPTION

Ejemplo de consultas en Linq to Sql Parte7

Text of Linq to sql 7

  • 1. LINQ to SLQ (Parte 7 Actualizando la base de datos con procedimientos almacenados)9 respuestasEn las ltimas semanas he escrito una serie de post sobre LINQ to SQL. Es un ORM integrado en .NET 3.5, y nos permite modelar bases de datos relacionales con clases de .NET. Podemos usar expresiones LINQ para consultar a la base de datos, actualiazarla, insertar y borrar datos.Aqu tenis los enlaces a los otros post: Parte 1: Introduccin a LINQ to SQL Parte 2: Definiendo el modelo de datos. Parte 3: Consultando la base de datos Parte 4: Actualizando la base de datos. Parte 5: Enlazar controles de interfaz de usuario con el ASP:LinqDatSource Parte 6: Obtener datos con procedimientos almacenados.En la sexta parte vimos cmo podemos usar procedimientos almacenados (SPROCs) y funciones definidas por el usuario (UDFs) para consultar la base de datos con el modelo de datos de LINQ to SQL. En el post de hoy veremos cmo podemos usar los SPROCs para actualizar/insertar/borrar datos de nuestra base de datos.Para ayudar a entender esto empezaremos costruyendo una capa de datos para la base de datos de ejemplo Northwind:Paso 1: Crear nuestra capa de acceso a datos (sin SPROCs)En la segunda parte de esta serie vimos cmo usar el diseador de LINQ to SQL de VS 2008 para crear el siguiente modelo de clases:

2. Aadiendo reglas de validacin a nuestro modelo de clases.Despus de definir nuestro modelo querremos aadir reglas de validacin a nuestro modelo de datos. Podemos hacer esto aadiendo clases parciales a nuestro proyecto y aadir las reglas de validacin en esas clases (vimos cmo hacer esto en la cuarta parte de esta serie).Por ejemplo, podemos aadir la lgica necesaria para asegurarnos de que el nmero de telfono de los clientes siguen un patrn vlido, y otra para asegurarnos de que la fecha de entrega (RequierdDate) es posterior a la fecha actual del pedido (OrderDate). Una vez que hemos definido las clases parciales, estos mtodos de validacin se ejecutarn cada vez que escribamos cdigo para actualizar nuestros objetos de datos de nuestra aplicacin:VB: 3. C#: 4. Aadir un mtodo de ayuda GetCustomer() a nuestro DataContextUna vez que hemos creado nuestro modelo de clases, y que le hemos aadido reglas de validacin, podemos consultar e interactuar con los datos. Podemos hacer esto escribiendo expresiones LINQ sobre nuestro modelo de clases (vimos cmo hacer esto en la tercera parte de esta serie). Tambin podemos mapear SPROCs en nuestro DataContext (esto lo vimos en la sexta parte de la serie).Cuando creamos una capa de datos con LINQ to SQL normalmente querremos encapsular consultas comunes de LINQ (o SPROCs) en mtodos auxiliares que aadiremos a la clase DataContext. Esto lo conseguimos aadiendo una clase parcial a nuestro proyecto. Por ejemplo, podemos aadir un mtodo llamado "GetCustomer()" que nos permita buscar y obtener objetos Customer de la base de datos a partir del valor CustomerID:VB: 5. C#:Paso 2: Usando nuestra capa de datos (seguimos sin SPROCs)Ya tenemos una capa de datos que encapsula nuestro modelo de datos, integra reglas de validacin, y nos permite consultar, actualizar, insertar y borrar datos.Veamos ahora un escenario simple usndolo para obtener un objeto customer existente, actualizamos el ContactName y el PhoneNumber, y creamos un nuevo objeto Order para asociarlos. El siguiente cdigo hace todo eso en una sola transaccin. LINQ to SQL se asegura de que las reglas de validacin se cumplen ntes de guardar nada en la base de datos:VB: 6. C#:LINQ to SQL monitoriza todas las modificaciones de los objetos que hemos obtenido de la base de datos, y guarda los objetos que aadimos. Cuando llamamos al mtodo DataContext.SubmitChanges(), LINQ to SQL comprueba las reglas que hemos establecido, y genera automticamente la SQL que actualizar el registro de Customer e insertar un nuevo registro en la tabla OrdersUn momento - Pensaba que este post iba sobre SPROCsSi an estais leyendo, os preguntaris dnde estn los SPROCs en este post. Porque os estoy mostrando el cdigo de arriba que hace que se genere una SQL dinmica? Por qu no os he enseado cmo llamar a un SPROC para hacer las inserciones/actualizaciones/borrados todava?La razn es que el modelo de programacin de LINQ to SQL tanto para trabajar con objetos modelados mediante SPROC es exactamente el mismo que con SQL dinmico. La manera en que aadimos validacin lgica es exactamente igual (as que todas las reglas que hemos aadido a nuestro modelo de datos se aplicarn tambin si usamos SPROCs). El cdigo anterior que hemos usado para obtener un cliente, actualizarlo y aadir un nuevo pedido es exactamente igual tanto si usamos SQL dinmico como si usamos SPROCs. 7. Esta simetra en el modelo de programacin es muy potente ya que no tenemos que aprender dos maneras diferentes de hacer las cosas, ni tenemos que decidir al principio del proyecto qu tcnica usar, si SPROC o no. Podemos empezar usando el SQL dinmico que nos da LINQ to SQL para las consultas, inserciones, actualizaciones y borrados. Podemos aadir reglas de validacin a nuestro modelo. Y luego podemos actualizar el modelo de datos para usar SPROCs - o no. El cdigo y los test que escribamos contra las clases del modelo de datos sern exctamente iguales.De ahora en adelante veremos cmo podemos actualizar nuestro modelo de datos usando SPROCs para actualizar/insertar/borrar - mientras seguimos usando las mismas reglas de validacin y trabajaremos con los mismos cdigos anteriores.Cmo usar SPROCs en inserciones, actualizaciones y borradosPodemos modificar la capa de datos que estamos construyendo para que use SPROCs, en lugar de SQL dinmico de dos maneras:1. Usando el diseador de LINQ to SQL para configurar grficamente la ejecucin de los SPROCs en las diferentes operaciones o2. Aadir una clase parcial NorthwindDataContext a nuestro proyecto, y entonces implementar los mtodos necesarios para la insercin, borrado y actualizacin. (por ejemplo: InsertOrder, UpdateOrder, DeleteOrder) que sern llamados cuando se realize alguna de las operaciones asociadas. Estos mtodos parciales sern pasados a las instancias del modelo de datos que queramos actualizar, y podemos ejecutar tanto SPROC como cdigo SQL para guardarlo.Cuando usemos la primera aproximacin para configurar grficamente los SPROCs que llamaremos, por debajo se est generando el mismo cdigo (en clases parciales que crea l solo) que escribiramos si elegimos la segunda opcin. En general os recomiendo que usis el diseador de LINQ to SQL para configurar los SPROCs en el 90% de los casos - y crear las llamadas personalizadas a procedimientos almacenados en escenarios ms avanzados.Paso 3: Hacer otras inserciones con un SPROCEmpezaremos cambiando nuestro modelo de datos para que use SPROCs con el objeto Order.Primero nos vamos a la ventana de "Explorador de Servidores" (Server Explorer) de Visual Studio, expandimos el nodo "Stored Procedures" de nuestra base de datos, hacemos clic con el botn derecho y elegimos la opcin "Add New Stored Procedure":Creamos el nuevo procedimiento almacenado que llamaremos "InsertOrder" que aade una nueva fila order a la tabla Orders: 8. Fijos que hemos definido el parmetro "OrderId" como un parmetro de salida. ESto es debido a que la columna OrderID es una columna identidad que se autoincrementa cada vez que se aade un nuevo registro. Quien llame a este SPROC dever pasarle un valor null en ese parmetro - y el SPROC devolver en ese parmetro el nuevo valor OrderID (llamando a la funcin SCOPE_IDENTITY() al final del SPROC).Despus de crear el SPROC abrimos el diseador de LINQ to SQL. De la misma forma que vimos en la sexta parte de esta serie, podemos arrastrar y soltar SPROCs desde la ventana "server explorer" al diseador. Esto es lo que haremos con el nuevo SPROC que acabamos de crear: 9. El ltimo paso ser decirle a nuestra capa de datos que use el SPROC InsertOrder cuano inserter un nuevo objeto Order en la base de datos. Esto lo hacemos seleccionando la clase "Order" del diseador LINQ to SQL, y en las propiedades clicamos el botn "..." del mtodo Insert:Hacemos clic en el botn "..." y aparecer una ventana que nos permite personalizar las operaciones de insercin: 10. Fijaos cmo el modo po defecto ("Use Runtime") est configurado para usar LINQ to SQL como generador dinmico de las SQL. Para cambiarlo seleccionamos el radio buton "Customize" y seleccionamos el SPROC InsertOrder de la lista de SPROCS disponibles:El diseador de LINQ to SQL calcular una lista de parametros para el SPROC que hemos seleccionado, permitindonos mapear las propiedades de nuestra clase Order a los parmetros del SPROC InsertOrder. Por defecto seleccionar el que ms se parezca en el nombre. Podemos cambiarlo si queremos. 11. Una vez que cliquemos en OK est listo. Ahora cada vez que aadamos un nuevo pedido a nuestro DataContext e invoquemos al mtodo SubmitChanges(), se ejecutar el SPROC InsertOrder.Importante: Aunque estemos usando SPROC para la persistencia, el mtodo parcial "OnValidate()" que creamos (en la primer parte de esta serie) para encapsular las reglas de validacin para los pedidos seguirn ejecutndose antes de realizar cualquier cambio. Es decir, tenemos una forma limpia de encapsular la lgica de negocio y las reglas de validacin en nuestros modelos de datos, y podemos reutilizarlos tanto si usamos SQL o SPROCS.Paso 4: Actualizando los clientes con SPROCs.Ahora vamos a modificar el objeto Customer para manejar las actualizaciones con un SPROC.Empezamos creando el SPROC "UpdateCustomer":Fijaos que adems de pasar el parmetro @CustomerID, tambin tenemos un parmetro @Original_CustomerID. La columna CustomerID de la tabla Customers no es un campo autoincremental, y puede modificarse cuando hagamos una actualizacin. Por tanto necesitamos ser capaces de decirle al SPROC cual es el CustomerID original y el nuevo CustomerID. Vamos a ver cmo mapeamos esto con el diseador de LINQ to SQL.Veris que estamos pasando un parmetro llamado @Version (que es u