Skip to content

1. Introducción

1.1. Objectif

El PDF del documento está disponible |AQUÍ|.

Los ejemplos del documento están disponibles |AQUÍ|.

Entity Framework es un ORM (mapeador objeto-relacional) creado inicialmente por Microsoft y que ahora está disponible como código abierto [juillet 2012, http://entityframework.codeplex.com/]. En un curso ASP.NET utilizo la siguiente arquitectura para una determinada aplicación web:

El marco NHibernate [http://sourceforge.net/projects/nhibernate/] es un ORM que apareció antes que Entity Framework. Se trata de un producto maduro que permite conectarse a diversas bases de datos. El ORM aísla la capa [DAO] (objetos de acceso a datos) del conector ADO.NET. Es el ORM el que envía las órdenes SQL al conector. La capa [DAO], por su parte, utiliza la interfaz que ofrece el ORM. Esta, a su vez, depende del ORM. Por lo tanto, cambiar el ORM implica cambiar la capa [DAO].

Esta arquitectura se adapta bien a los cambios en SGBD.

Cuando se conecta la capa [DAO] directamente al conector ADO.NET, cambiar el SGBD afecta a la capa [DAO]:

  • las capas SGBD no tienen todas el mismo tipo de datos;
  • los SGBD no tienen las mismas estrategias de generación de claves primarias;
  • los SGBD contienen SQL de propiedad exclusiva;
  • la capa [DAO] pudo haber utilizado bibliotecas vinculadas a un SGBD concreto;
  • ...

Cuando es un ORM el que está vinculado al conector ADO.NET, cambiar el SGBD equivale a modificar la configuración del ORM para adaptarla al nuevo SGBD. La capa [DAO] no cambia.

El marco Spring.NET [http://www.springframework.net/index.html] garantiza la integración de las capas de una aplicación. Arriba:

  • la aplicación ASP.NET solicita a Spring una referencia a la capa [DAO];
  • Spring utiliza un archivo de configuración para crear esta capa y devolver la referencia.

Esta arquitectura se adapta bien a los cambios en las capas, siempre y cuando estas mantengan la misma interfaz. Modificar la capa [DAO] anterior consiste en cambiar el archivo de configuración de Spring para que se instancie la nueva capa en lugar de la antigua. Dado que ambas implementan la misma interfaz y que la capa ASP.NET utiliza dicha interfaz, la capa ASP.NET permanece inalterada.

Por lo tanto, nos encontramos ante una arquitectura flexible y evolutiva. Para demostrarlo, vamos a sustituir ORM y NHibernate por Entity Framework 5:

Vamos a proceder en varias etapas:

  • descubriremos Entity Framework 5 con varios SGBD;
  • crearemos la capa [DAO2];
  • conectaremos la aplicación ASP.NET existente a esta nueva capa [DAO].

1.2. Herramientas utilizadas

Las pruebas se han realizado en un portátil HP EliteBook con Windows 7 Pro, un procesador Intel Core i7 y 8 GB de RAM. Utilizaremos C# como lenguaje de desarrollo.

El documento utiliza las siguientes herramientas, todas ellas disponibles de forma gratuita:

Herramientas de desarrollo:

  • Visual Studio Express para Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
  • Visual Studio Express para la web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].

SGBD SQL Server Express 2012:

  • SGBD: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
  • una herramienta de administración: EMS, SQL Manager para SQL Server Freeware, [http://www.sqlmanager.net/fr/products/mssql/manager/download].

SGBD Oracle Database Express Edition 11g Versión 2:

  • el SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
  • una herramienta de administración: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
  • un cliente de Oracle para .NET: ODAC 11.2 Release 5 (11.2.0.3.20) con Oracle Developer Tools para Visual Studio: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].

El SGBD MySQL 5.5.28:

  • el SGBD: [http://dev.mysql.com/downloads/];
  • una herramienta de administración: EMS, SQL Manager para MySQL, Freeware [http://www.sqlmanager.net/fr/products/mysql/manager/download].

El SGBD PostgreSQL 9.2.1:

  • el SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
  • una herramienta de administración: EMS SQL Manager para PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].

El SGBD Firebird 2.1:

  • el SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/];
  • una herramienta de administración: EMS SQL Manager para InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].

LINQPad 4: una herramienta de aprendizaje de LINQ (Language INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. Los códigos fuente

Los códigos fuente de los ejemplos que siguen están disponibles en el URL [http://tahe.developpez.com/dotnet/ef5cf].

Se trata de proyectos de Visual Studio 2012 [1], agrupados en una solución [2]. En una carpeta [databases], encontrarás una carpeta por cada SGBD utilizado. En ella se encuentran los scripts SQL para generar la base de datos de ejemplo para estos SGBD.

1.4. El método

Para familiarizarme con Entity Framework 5 Code First, partí en primer lugar del siguiente libro: «Professional ASP.NET MVC 3», de Jon Galloway, Phil Haack, Brad Wilson y Scott Allen, publicado por Wrox. En la aplicación de ejemplo de este libro, los autores utilizan Entity Framework (EF) como ORM. Como no lo conocía, busqué en Internet para obtener más información. Así descubrí que la versión más reciente era la 5 y que había incompatibilidades con la versión 4, ya que el código del libro, al probarlo con la versión 5, presentaba errores de compilación.

A continuación, descubrí que había varias formas de utilizar EF:

  • «Model First»: hay numerosos artículos sobre este enfoque de EF, por ejemplo, [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Este artículo comienza de la siguiente manera:

Resumen: En este artículo analizaremos el nuevo Entity Framework 4 que se incluye con .NET Framework 4 y Visual Studio 2010. Explicaré cómo se puede abordar su uso desde una perspectiva «model first», partiendo de la premisa de que es posible dirigir el diseño de la base de datos a partir de un modelo y construir tanto la base de datos como la capa de acceso a los datos de forma declarativa a partir de dicho modelo. El modelo contiene la descripción de los datos representados como entidades y relaciones, lo que proporciona un enfoque potente para trabajar con ADO.NET, creando una separación de responsabilidades mediante una abstracción entre la definición del modelo y su implementación.

Un ORM sirve de puente entre las tablas de las bases de datos y las clases.

Arriba,

  • a la izquierda de la capa EF5, tenemos objetos, denominados entidades;
  • a la derecha de la capa EF5, tenemos tablas de bases de datos.

La capa [DAO] trabaja con objetos de imagen de las tablas de la base de datos. Estos objetos se agrupan en un contexto de persistencia y se denominan entidades (Entity). Los cambios realizados en las entidades se reflejan, gracias a la capa ORM, en las tablas de la base de datos (inserción, modificación, eliminación). Además, la capa [DAO] dispone de un lenguaje de consulta LINQ to Entity (Language INtegrated Query) que realiza consultas sobre las entidades y no sobre las tablas. El método «Model First» consiste en construir las entidades con una herramienta gráfica. Se define cada entidad y las relaciones que la vinculan con las demás. Una vez hecho esto, una herramienta permite generar:

  • las diferentes clases que reflejan las entidades creadas gráficamente;
  • el DDL (lenguaje de definición de datos) que permite generar la base de datos.

Todos los ejemplos que encontré sobre este método utilizaban Visual Studio 2010 Professional y un modelo denominado ADO.NET Entity Data Model. Pude probar este modelo con Visual Studio 2010 Professional, pero cuando pasé a Visual Studio Express 2012, que era mi objetivo, me di cuenta de que este modelo ya no estaba disponible. Así que descarté este enfoque.

  • «Database First»: el punto de partida de este método es una base de datos ya existente. A partir de ahí, una herramienta genera automáticamente las entidades que representan las tablas de la base de datos. Una vez más, los ejemplos que encontré, como por ejemplo [http://msdn.microsoft.com/en-us/data/gg685489.aspx], utilizan Visual Studio 2010 Professional y el modelo «ADO.NET Entity Data Model». Así que también descarté este enfoque, que sin embargo era mi favorito. Para saber qué entidades utilizar como representaciones de una base de datos existente, lo más sencillo era empezar con una herramienta que las generara.
  • Code First: uno mismo escribe las clases que formarán las entidades. Para ello, es necesario tener unos conocimientos mínimos sobre el funcionamiento de EF. Este es el camino que seguí porque era compatible con Visual Studio Express 2012.

Una vez hecho esto, trabajé de la siguiente manera:

  • escribía código para SQL Server Express 2012, ya que es para esta versión de SGBD donde se encuentran la mayoría de los ejemplos;
  • una vez depurado este código, lo adaptaba a los demás SGBD (Firebird, Oracle, MySQL, PostgreSQL).

Aquí vamos a proceder de forma diferente. Primero describiré todos los códigos para SQL Server y, a continuación, describiré su adaptación a los demás SGBD. En esta adaptación, se realizan los siguientes ajustes:

  • las bases de datos tienen características propias. En concreto, he utilizado «triggers» para generar el contenido de ciertas columnas de forma automática. Cada SGBD tiene su propia forma de gestionar esto;
  • las entidades de imagen de las tablas pueden cambiar, pero en ese caso es de forma deliberada. Podría haber elegido entidades adecuadas para todas las bases de datos;
  • el controlador ADO.NET del SGBD cambia;
  • La cadena de conexión al SGBD cambia.

El procedimiento a seguir es el siguiente:

  • asociación de entidades con la base de datos. Rellenado de la base;
  • volcado de la base de datos mediante consultas LINQ;
  • LINQPad, una herramienta de aprendizaje de LINQ;
  • adición, eliminación y modificación de entidades;
  • gestión de la concurrencia de acceso;
  • contexto de persistencia guardado en una transacción;
  • modificación de una entidad fuera del contexto de persistencia;
  • carga anticipada (Eager) y diferida (Lazy);
  • construcción de la capa [DAO];
  • construcción de la capa web ASP.NET.

1.5. Público objetivo

Este documento está dirigido a principiantes.

Este documento no es un curso sobre Entity Framework 5 Code First. Para ello, se puede consultar, por ejemplo, «Programming Entity Framework: Code First», de Julie Lerman y Rowan Miller, publicado por O'Reilly. El documento no pretende en absoluto ser exhaustivo, sino que simplemente expone el enfoque que he utilizado para abordar este ORM. Creo que este enfoque puede ser útil para otras personas que se inicien en EF5. Mi objetivo no va más allá de este marco.

1.6. Artículos relacionados con developpez.com

El libro citado anteriormente servirá de referencia. Además, existen artículos dedicados a Entity Framework en developpez.com. He aquí algunos de ellos:

Como se ha indicado anteriormente, el presente documento no es exhaustivo. Resulta muy útil leer los artículos mencionados anteriormente para subsanar ciertas lagunas. Es posible que mi investigación haya sido incompleta. Ruego a los autores que haya podido olvidar que me disculpen.