Está en la página 1de 16

23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .

NET

LINQ to SQL (2 Parte De niendo nuestras clases


del modelo de datos)
En la primera parte de la serie de post sobre LINQ to SQL habl sobre "qu es LINQ to SQL?" y vimos por
encima algunos escenarios que permite.

En aqul post pusimos unos cuantos ejemplos de cdigo donde demostrbamos cmo mejorar la parte de
datos usando LINQ to SQL:

Cmo consultar una base de datos.


Cmo actualizar las en una base de datos
Cmo aadir y relacionar varias las en una base de datos.
Cmo eliminar las de la base de datos.
Cmo llamar a procedimientos almacenados.
Cmo obtener datos con paginacin en el servidor.

Mejoramos todos estos escenarios usando un modelo de clases de LINQ to SQL como ste:

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 1/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

En este segundo post de la serie vamos a ver en ms detalle cmo crear el modelo anterior con LINQ to
SQL.

LINQ to SQL, el diseador de LINQ to SQL, y todas las caractersticas que estamos viendo saldrn con la
versin de .NET 3.5 y en la release de Visual Studio "Orcas".

Podis seguir todos los pasos siguientes descargndo tanto Visual Studio "Orcas" Beta 1 oVisual Web
Developer Express "Orcas" Beta 1.Podis instalar las dos y usarlas sin ningn problema con Visual
Studio2005.

Crear un nuevo modelo de datos LINQ to SQL

Podemos aadir un modelo de datos de LINQ to SQL a un projecto ASP.NET, Class Library o Windows, con
la nueva opcin "Add New Item" seleccionando "LINQ to SQL":

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 2/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Seleccionando "LINQ to SQL" lanzar el diseador de LINQ to SQL, y nos permitir modelar las clases que
representen una base de datos relacional. Tambin crear una clas fuertemente tipada "DataContext" que
tendr las propiedades que representarn cualquier tabla que modelemos de la base de datos, as como
mtodos para cada procedimiento almacenado que modelemos. Como describimos en la primera parte de
esta serie de post, la clase DataContext es el conducto principal que usaremos tanto para consultar la base
de datos como para guardar los cambios que hagamos.

Aqu tenis una captura de pantalla de un diseo LINQ to SQL ORM vaco, es lo que veris despues de crear
un nuevo modelo de datos LINQ to SQL:

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 3/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Clases Entidad (Entity)

LINQ to SQL nos permite modelar clases que mapeen una base de datos. Estas clases son tpicamente
conocidas como "Clases Entidad" (en ingles "Entity Classes") y a las instancias se las conoce como
"Entidades" (en ingles "Entities"). Las clases entidad mapean a tablas de una base de datos. Las
propiedades de una clase entidad normalmente mapean las columnas de la tabla. Cada instancia de una
clase entidad representa a una la de una tabla de la base de datos.

Las clases entidad de nidas por LINQ to SQL no tienen que derivar de una clase base espec ca, lo que
signi ca que pueden heredar de cualquier objeto que queramos. Todas las clases creadas por el diseador
de LINQ to SQL se de nen como "clases parciales" - con lo que podemos, opcionalmente, aadir
propiedades adicionales, mtodos y eventos.

A diferencia de la caracterstica de DataSet/TableAdapter que aporta VS 2005, cuando usamos el diseador


de LINQ to SQL no tenemos que especi car qu consultas SQL se tiene que usar cuando creamos el
modelo de datos y la capa de acceso.

En lugar de eso, nos centramos en de nir las clases entidad, cmo se mapean con la base de datos, y las
relaciones entre ellas. La implementacin del ORM de LINQ to SQL se encargar de generar la lgica de
ejecucin SQL por nosotros en tiempo de ejecucinpara que podamos interactuar y usar las entitades de
datos. Podemos usar sintaxis de consultas LINQ para indicar cmo consultar nuestro modelo de datos de
forma fuertemente tipada.

Crear clases entidad de la base de datos.

Si ya tenemos un esquema de base de datos de nido, podemos usarlo para crear clases entidad LINQ to
SQL.

La forma ms sencilla de conseguirlo es abrir la base de datos desde el "Server Explorer" de Visual Studio,
seleccionar las tablas y vistas (Views) que queramos modelar, y arrastrarlas al diseador LINQ to SQL:

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 4/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Cuando aadimos estas dos tablas (Categories y Products) y una vista (Invoices) de la base de datos
"Northwind" al diseador de LINQ to SQL, tendremos las siguientes clases entidad creadas a partir del
esquema de la base de datos:

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 5/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Usando estas clases, podemos ejecutar todos los ejemplos de cdigo (excepto el de procedimientos
almacenados) que vimos en la primera parte de esta serie sobre LINQ to SQL. No tenemos que aadir
ningn cdigo adicional o con guracin para habilitar los escenarios de consulta, insercin, actualizacin,
borrado, y paginacin en el servidor.

Nombrado y pluralizacin

Una de las cosas de las que os daris cuenta usanto el diseador de LINQ to SQL es que automticamente
"pluraliza" los nombres de las tablas y columnas cuando crea las clases entidad basdas en el esquema de
la base de datos. Por ejemplo: la tabla "Products" del ejemplo se resuelve en una clase "Product", y la tabla
"Categories" se resuelve en la clase "Category". Este nombrado de clases hace que vuestro modelo sea ms
consistente con las convenciones de nomenclatura de .NET, y encuentro bastante til que el diseador
haga esto por mi (especialmente cuando aadimos muchas tablas a nuestro modelo).

Si no os gusta el nombre de una clase o propiedad que el diseador ha generado, siempre podris
cambiarlo por el que queris. Podis hacerlo editanto el nombre de la entidad/propiedad en el mismo
diseador o cambiarlo en la rejilla de propiedades:

Esta habilidad de nombrado de entidades/propiedades/asociaciones es muy til en un gran nmero de


casos. En particular:

1) Cuando cambie el nombre de una tabla/columna de vuestra base de datos. Como vuestras entidades
tendrn nombres diferentes, podis decidir actualizar las reglas de mapeado y no el cdigo de vuestra
aplicacin o las consultas para usar esas nuevas tablas/columnas.

2) Cuando en el esquema de la base de datos tengais nombres que no son "limpios". Por ejemplo, en lugar
de usar "au_lname" y "au_fname" para los nombres de las propiedades en una clase entidad, podis usar
los nombres de "LastName" y "FirstName" en vuestras clases entidad y programar con esos nombres, en
vez de cambiarlo en la base de datos.

Relaciones

Cuando arrastremos objetos del "server explorer" al diseador "LINQ to SQL", Visual Studio comprobar las
relaciones de clave primaria y ajenas de los objetos, y basndose en ellas crear relaciones por defecto
entre las diferentes clases entidad que genere. Por ejemplo, cuando aadimos las tablas Products y
Categories de la base de datos NorthWind al diseador LINQ to SQL podemos ver que se ha deducido una
relacin de uno a n entre ellas (esto se indica con la felcha del navegador):

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 6/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Esta relacin har que la clase entidad Product tenga una propiedad llamada "Category" que los
desarrolladores usarn para acceder a la entidad Category para un Product dado. Tambin har que la
clase Category tenga una coleccin de "Products" que permitir a los desarrolladores obtener todos los
productos de una Category.

Si no nos gusta cmo el diseadora nombrado a la relacin, siempre podrmos cambiarlo. Slo hay que
hacer clic en la felcha en el diseador, ver las propiedades y cambiar el nombre.

Retrasar la carga

LINQ to SQL permite a los desarrolladores especi car si las propiedades de las entidades deben
precargarse o retrasarse hasta el primer acceso. Podemos personalizar las reglas de precarga/retraso para
las propiedades de las entidades seleccionando cualquier propiedad o asociacin en el diseador, y en las
propiedades poner la propiedad "Delay Loaded" a true o false.

Por poner un ejemplo, imaginemos la clase entidad "Category" del modelo anterior. La tabla "Categories"
de la base de datos "NorthWind" tiene una columna "Picture" que contiene una imagen (potencialmente

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 7/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

grande) para cada categora, y slo queremos esa imagen cuando vaya a usarla (y no cuando est haciendo
una consulta para obtener los nombres de las categoras en una lista).

Podramos con gurar la propiedad Picture para que se retrase su carga seleccionandola en el diseador de
LINQ to SQL y en las propiedades poner "Delay Loaded"a true:

Nota: Adems de con gurar el signi cado de la precarga/retraso de las entidades, podemos sobreescribirlo
va cdigo cuando hagamos consultas LINQ en las clases entidad (lo veremos en el siguiente post de esta
serie).

Usando procedimientos almacenados.

LINQ to SQL nos permite modelar procedimientos almacenados como mtodos de nuestra clase
DataContext. Por ejemplo, supongamos que hemos de nido un procedimiento almacenado simple para
obtener la informacin de un producto de un categoryID:

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 8/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Podemos usar el server explorer de Visual Studio y arrastrar este procedimiento almacenado al diseador
de LINQ to SQL para obtener un mtodo fuertemente tipado que invocar a este procedimiento
almacenado. Si lo arrastramos encima de la entidad "Product" en el diseador, el diseador declarar que
el procedimiento almacenado devuelve un IEnumerable<Product>:

Podemos usar tanto una consulta SQL (que generar una consulta SQL adhoc) o invocar el procedimiento
almacenado aadido para obtener las entidades product de la base de datos:

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 9/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Usar procedimientos almacenados para actualizar/borrar/insertar datos.

Por defecto LINQ to SQL crear automticamente expresiones SQL apropiadas para cuando tengamos que
insertar/actualizar/borrar entidades. Por ejemplo, si escribimos el siguiente cdigo LINQ to SQL para
actualizar algunos valores en una instancia de la entidad "Product":

LINQ to SQL crear y ejecutar una sentencia "UPDATE" apropiada para cuando aceptemos los cambios
(Veremos esto en ms profundidad en otros post).

Podemos de nir procedimientos almacenados personalizados para INSERT, UPDATE, DELETE. Para
con gurar esto, hacemos clic en una entidad del diseador LINQ to SQL y en las propiedades de
Delete/Insert/Update, en el botn "...", y ponemos un procedimiento almacenado que ya hayamos de nido.

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 10/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Lo curioso es que el cambio de estas propiedades se est realizando en la capa de mapeo de LINQ to SQL -
lo que implica que la actualizacin del cdigo que vimos ntes sigue funcionando sin tener que hacer
ninguna modi cacin. Con esto libramos a los desarrolladores de que si cambiamosel modelo de datos
LINQ to SQL, no tienen que tocar ningn cdigo para que sigua funcionando si deciden poner un
procedimiento almacenado personalizado.

Resumen

LINQ to SQL provee una forma limpia de modelar las capas de datos de nuestras aplicaciones. Una vez que
tengamos nuestro modelado de datos, podemos realizar de forma e ciente consultas, inserciones,
actualizaciones, y borrados sobre l.

Con el diseador de LINQ to SQL que viene en Visual Studio y en Visual Web Developer Express podemos
crear y administrar nuestros modelso de datos para LINQ to SQL extremadamente rpido. El diseador
LINQ to SQL tambin permite una gran exibilidad que nos permite personalizar el comportamiento por
defecto y sobreescribir/extender el sistema para que se adapte a nuestras necesidades.

En prximos post usaremos este modelo que hemos creado para ver en ms detalle los procesos de
consulta, inserciones, actualizaciones y borrados. En estos post tambin veremos cmo aadir validaciones
negocio/datos personalizadas a las entidades que hemos diseado.

Mike Taulty tiene una gran cantidad de videos sobre LINQ to SQL aqu, os recomiendo que los veis. As
tenis una forma de aprender viendo cmo se usa LINQ to SQL.

Espero que sirva.

Scott.

Traducido por: Juan Mara La Ramos. Microsoft Student Partner

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 11/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Comparte esto:

Facebook 3 Twitter LinkedIn Ms

Esta entrada fue publicada en .NET, ASP .NET, LINQ, LINQ to SQL, Visual Studio el 30 Mayo, 2007
[http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-de niendo-nuestras-clases-del-modelo-de-
datos/] .

21 pensamientos en LINQ to SQL (2 Parte De niendo nuestras clases del modelo de


datos)

Pingback: Nuevo soporte para datos dinmicos en ASP.NET Thinking in .NET

Alfredo Cerrillo
21 Julio, 2008 en 23:01

No s si alguien tenga el mismo problema, pero me parece que el diseador de clases no genera las
propiedades parent y child que se esperan de una asociacin personalizada. Slo genera dichas
propiedades cuando la relacin ya viene de nida en la base de datos.

Alfredo Cerrillo
21 Julio, 2008 en 23:27

Me equivoqu. El problema es que haba hijos sin padres en n, eso pasa cuando no hay integridad
referencial.

julio
1 Agosto, 2008 en 22:24

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 12/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Jess Flores
24 Junio, 2009 en 19:27

Me ha parecido que hay muy pocos posts de agradecimiento.

Por la pulcritud, limpieza, claridad, nivel de correccin en tus posts. Gracias

Alfonso Olvera
1 Septiembre, 2009 en 17:09

Gracias por publicar conocimientos tan valiosos. Hay una parte en este articulo donde se re ere a la
pluralizacion, pero de acuerdo al contexto de dicho funcionamiento yo creo que no pluraliza ya que esta
realizando lo contrario. Es decir la tabla products (plural) se convierte automaticamente a la clase product
(singular) Creo que el texto de ingles tambien manejan el mismo enfoque.

cursosudal
14 Octubre, 2009 en 4:04

Tambin agradezco la aportacin, esta muy clara y comprensible, solamente tengo una pregunta, para el
caso en que el store procedure, regrese valores de salida (output), como se realizara con Linq. Saludos.

Amilcar
2 Diciembre, 2009 en 15:44

Gracias por el articulo Les dejo mi correo si alguien tiene dudas.


milka_indy@hotmail.com

Pingback: ASP.NET MVC Framework (Primera parte) Thinking in .NET

Pablo
15 Abril, 2010 en 20:41

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 13/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Realmente muy claro y didactico !! Lo felicito por el esfuerzo y la dediacion que puso en realizar este curso !!

Mamfredy
14 Junio, 2010 en 21:09

El post es bantante didactico y claro, realmente me a ayudado mucho con el proyecto que estoy llevando a
cabo..

Gracias y Salu2 Desde Ecuador???

carlos
14 Noviembre, 2010 en 1:21

Est muy bueno este post y entendible, gracias por este aporte.

saludos desde Venezuela!!

Miguel Bahena
16 Febrero, 2011 en 14:32

Excelente posts amigo, muy claro, prctico y al grano.

Luis
6 Marzo, 2011 en 11:02

Excelente post, me ha sido de mucha utilidad.

go ys
25 Mayo, 2011 en 14:37

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 14/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

claro, conciso, sin dar vueltas

Gracias!

Saludos.

MaironBurn
20 Septiembre, 2011 en 12:35

Muchas Gracias por el Tutorial, superb

Eduardo
21 Marzo, 2012 en 21:42

Una consulta.estoy probando en Visual Studio 2008 y he notado que no me pluraliza.


Adicionalmente a esto, cuando hago referencia a mi dataContext e intento hacer un Add a alguna tabla, los
cambios no se ven re ejados en la base de datos. No se produce ninguna excepcin ni nada por el estilo.
Alguna idea?

omar
3 Abril, 2012 en 17:42

buen tutorial , solo que estaria bien algo que evite el uso de asistentes

JuandeDiosElias
12 Junio, 2012 en 18:55

Gracias por este aporte me est sirviendo de mucho

Karen
17 Septiembre, 2012 en 2:13
http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 15/16
23/8/2017 LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos) | Speaking in .NET

Muy excelente post. Solamente una duda, he querido probar pero al momento de seleccionar el servidor
de base de datos solo esta Sql Server y Oracle hay alguna forma de utilizar MySql?

Jorge
24 Junio, 2014 en 5:19

Podemos usar tanto una consulta SQL (que generar una consulta SQL adhoc) o invocar el procedimiento
almacenado aadido para obtener las entidades product de la base de datos.

Como realizo este paso en Visual Studio 2013

Los comentarios estn cerrados.

http://speakingin.net/2007/05/30/linq-to-sql-2%c2%aa-parte-definiendo-nuestras-clases-del-modelo-de-datos/ 16/16

También podría gustarte