Posts etiquetados ‘.Net’

h1

Escribiendo consultas LINQ con Entity Framework (I)

Octubre 25, 2008

Linq to Entities es una nueva extensión para Linq (.Net 3.5) que hace que programar contra bases de datos sea mas fácil que nunca reduciendo los errores de impedancia en las tablas, columnas, filas de las base de datos y nuestro modelo de objetos.

El problema hasta ahora era que había distintos lenguajes para consultar información de Active Directory, Bases de datos, XML, objetos, etc. Tenias que conocer el funcionamiento y la gramática de Xpath, LDAP y muchos otros según el almacenamiento de la información. Con LINQ este problema desaparece ya que nos proporciona una tecnología para acceder a cualquiera de las tecnologías mencionadas anteriormente usando un lenguaje y gramática comunes. De esta manera nuestro código se independiza de nuestra forma de almacenamiento de datos. Hoy podemos tener la información en una base de datos y mañana lo mismo en un fichero XML, de manera que la misma consulta funcione sin cambios.

Creando un Entity Data Model

Para usar Entity Framework es necesario tener instalado el Service Pack 1 de Visual Studio 2008. Una vez instalado ya podremos ver una nueva opción en el menú Add New Item (no se como se llama esta opción en castellano, creo que es Añadir Nuevo Elemento).

Para este ejemplo voy a usar una aplicación de consola con la base de datos Northwind para que resulte todo más sencillo. Los pasos a seguir son los siguientes:

  1. Una vez creado el proyecto de aplicación de consola nos vamos al menú Project->Add New Item y seleccionamos ADO.NET Entity Data Model.

  2. Le asignamos un nombre a nuestro Data Model, por ejemplo NorthWindModel.edmx y presionamos Add.

  3. En la siguiente pantalla seleccionamos Generate From Database y damos Next

  4. En la pantalla siguiente debemos indicar la cadena de conexión a nuestra base de datos, pudiendo elegir entre una ya creada o componer una nueva. Tenemos un check para guardar dicha cadena en nuestro fichero .config de la aplicación, pudiendo cambiarle también el nombre. Una vez realizados todos los cambios pulsamos Next

  5. En la siguiente pantalla nos aparece una lista con las tablas, vistas y procedimientos almacenados. Seleccionamos Customers,Orders,Order Details y Products. Una vez añadidas pulsamos Finish y se genera nuestro Data Model.

Obtendremos algo parecido a esto:

Ejecutando consultas

Linq es un lenguaje muy parecido a SQL, la principal diferencia es que la cláusula FROM se encuentra al principio y el SELECT al final. Esto es así para que pueda funcionar correctamente el intellisense de Visual Studio. De esta manera intellisense sabe a que objeto nos estamos refiriendo y nos muestra sus propiedades según vamos escribiendo.

Un ejemplo muy sencillo:

static void Main(string[] args)

{

using (NorthwindEntities context = new NorthwindEntities())

{

var clientes = from p in context.Customers

select p;

foreach (Customers cliente in clientes)

{

Console.WriteLine(cliente.ContactName);

}

}

Console.ReadLine();

}

Explico brevemente el codigo:

  • using (NorthwindEntities context = new NorthwindEntities()) Con esta linea indicamos que vamos a usar el model que hemos creado anteriormente y gracias al using todas las operaciones se abriran y cerraran solas sin tener que preocuparnos por ello.

  • var clientes = from p in context.Customers select p; Es la query a ejecutar. Hace uso de los tipos anonimos (var). De esta manera se infiere el tipo del objeto en la parte izquierda a partir de la parte derecha. Esta consulta simplemente obtiene todos los registros guardados en Customers.

  • foreach (Customers cliente in clientes): Recorro el objeto clientes y voy mostrando el ContactName de cada uno de los objetos Customer que contiene.

Si quiesemos que nos cargase tambien los objetos de tipo Order relacionados con Customers tenemos dos opciones:

  • Cargarlos directamente en nuestra consulta usando el metodo .Include():

var clientes = from p in context.Customers.Include(“Orders”)

select p;

Se pueden encadenar los includes, pero hay que ser cuidadoso con este sistema pues puede llegar a realizar cargas muy lentas y bloquear la ejecución.

  • Cargarlo mediante codigo, de esta manera se puede cargar solamente si se cumple una condicion, comprobar si no esta ya cargado, etc.

foreach (Customers cliente in clientes)

{

cliente.Orders.Load();

}

h1

Sobrecargar .ToString() para facilitar la depuración

Septiembre 16, 2008

Muchas veces a la hora de depurar nos encontramos con que no vemos rapidamente las propiedades que nos interesan de nuestros objetos, por que hay muchas o por otro tipo de razon, o simplemente para facilitar el logeo de errores . Una buena manera de solucionar esto es sobrecargar el metodo .ToString() de nuestros objetos. De esta manera podremos personalizar los que nos devuelve de forma mas util para nosotros. Imaginemos que tenemos una clase Persona con dos propiedades: Nombre y Apellido. En este sencillo ejemplo querremos mostrar el valor de los dos campos, para ello simplemente pondremos lo siguiente dentro del codigo de nuestra clase:

public override ToString() { return “Nombre: ” + Nombre + “; Apellido: ” + Apellido; }

De esta forma pasariamos de ver esto: A ver esto otro:

A la hora de logear posibles fallos tambien nos dara mucha flexibilidad pues con solo llamar al metodo .ToString de nuestros objetos podremos tener accesibles todas sus propiedades y debidamente formateadas.

h1

Solucion al error: “The custom tool ‘MSLinqToSQLGenerator’ failed while processing the file …”

Septiembre 5, 2008

Hoy actualizando mi equipo al SP1 de Visual Studio 2008 y del Framework 3.5 me ha surgido el siguiente error en una aplicación que en otros equipos funcionaba perfectamente:

“The custom tool ‘MSLinqToSQLGenerator’ failed while processing the file ‘App_Code\PrescripcionModel.dbml’”

Creia que algo habia fallado en la instalacion y probe a repararla, instalar ultimas versiones de los complementos y nada funcionó.

Al final simplemente tuve que borrar todas las subkeys por debajo de HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Packages en el registro y todo volvio a la normalidad.

Todo gracias a este link

h1

Links interesantes sobre .Net y TFS

Septiembre 2, 2008

Hoy voy a hacer una recopilacion de links a diferentes paginas que me han resultado interesantes:

h1

Programa para imprimir las tablas de una base de datos SQL Server

Marzo 10, 2008

Hoy navegando me he encontrado este programita que genera una pagina aspx con todas las tablas, nombres de columnas, el tipo de datos de la columnas y mas información. Es bastante simple y sirve para tener una referencia mas completa de la base de datos.

http://code.msdn.microsoft.com/dbprint