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 surgió antes de Entity Framework. Es 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]:
- no todas las capas SGBD tienen los mismos tipos 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 específico;
- ...
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] mencionada anteriormente consiste en modificar el archivo de configuración de Spring para que se instancie la nueva capa en lugar de la anterior. Dado que ambas implementan la misma interfaz y que la capa ASP.NET utiliza dicha interfaz, la capa ASP.NET permanece sin cambios.
Por lo tanto, contamos aquí con una arquitectura flexible y escalable. Para demostrarlo, vamos a reemplazar ORM y NHibernate por Entity Framework 5:
![]() |
Procederemos en varias etapas:
- descubriremos Entity Framework 5 con varios SGBD;
- construiremos la capa [DAO2];
- conectaremos la aplicación existente ASP.NET a esta nueva capa [DAO].
1.2. Las herramientas utilizadas
Las pruebas se realizaron en una computadora 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 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:
- el 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].
El 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. Ahí están 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, comencé por el 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 saber más. Así descubrí que la versión más reciente era EF 5 y que había incompatibilidades con EF 4, ya que el código del libro, al probarlo con EF 5, presentaba errores de compilación.
Luego descubrí que había varias formas de utilizar EF:
- Model First: existen 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 viene incluido con .NET Framework 4 y Visual Studio 2010. Discutiré cómo se puede abordar su uso desde una perspectiva de «modelo primero», con la premisa de que se puede guiar 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 datos de manera declarativa a partir de este modelo. El modelo contiene la descripción de los datos representados como entidades y relaciones, lo que ofrece un enfoque poderoso para trabajar con ADO.NET, creando una separación de preocupaciones mediante una abstracción entre la definición del modelo y su implementación.
Un ORM sirve de puente entre las tablas de la base de datos y las clases.
![]() |
Arriba,
- a la izquierda de la capa EF5, tenemos objetos, a los que llamamos entidades;
- a la derecha de la capa EF5, se encuentran las 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] cuenta con 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 archivo 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 llamado ADO.NET Entity Data Model. Pude probar este modelo con Visual Studio 2010 Professional, pero cuando cambié a Visual Studio Express 2012, que era mi objetivo, me di cuenta de que este modelo ya no estaba disponible. Por lo tanto, descarté este enfoque.
- «Database First»: el punto de partida de este método es una base de datos 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 comenzar con una herramienta que las generara.
- Code First: uno mismo escribe las clases que formarán las entidades. Para ello, es necesario tener un mínimo de conocimientos sobre el funcionamiento de EF. Este es el camino que seguí porque era compatible con Visual Studio Express 2012.
Una vez logrado 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 cantidad de ejemplos;
- una vez depurado ese código, lo adaptaba a los demás SGBD (Firebird, Oracle, MySQL, PostgreSQL).
Aquí procederemos de manera diferente. Primero describiré todos los códigos para el servidor SQL y luego describiré su adaptación para los demás SGBD. En esta adaptación, se realizan los siguientes ajustes:
- las bases de datos tienen características propias. En particular, he utilizado disparadores (triggers) para generar el contenido de ciertas columnas de manera automática. Cada SGBD tiene su propia forma de manejar esto;
- las entidades de imagen de las tablas pueden cambiar, pero esto es intencional. Podría haber elegido entidades que se adaptaran a 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. Llenado de la base;
- volcado de la base de datos con consultas LINQ;
- LINQPad, una herramienta de aprendizaje de LINQ;
- agregar, eliminar y modificar 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 eso, se puede leer, 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 utilicé para comprender 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 mencionado anteriormente servirá como referencia. Además, existen artículos dedicados a Entity Framework en developpez.com. A continuación, te presento algunos de ellos:
- «Entity Framework: el enfoque Code First», junio de 2012, por Reward. Este artículo y el presente documento se superponen parcialmente. Sin embargo, el primero profundiza más en ciertos puntos, en particular en el «mapeo» de herencia entre clases y tablas;
- «Introducción a Entity Framework», diciembre de 2008, por Paul Musso;
- «Crear un modelo de clases con Entity Framework», abril de 2009, por Jérôme Lambert;
- «Medición del rendimiento de Linq to SQL frente a SQL y Entity Framework», junio de 2011, de Immobilis;
- "Entity Framework Code First: activar la migración automática", junio de 2012, por Hinault Romaric;
- «Creación de una aplicación CRUD con WebMatrix, Razor y Entity Framework», mayo de 2012, por Hinault Romaric;
- «Entity Framework: un recorrido por Code First Migrations», junio de 2012, por Hinault Romaric;
Como se indicó anteriormente, el presente documento no es exhaustivo. Se recomienda leer los artículos mencionados anteriormente para completar cierta información. Es posible que mi investigación haya sido incompleta. Pido disculpas a los autores que haya podido omitir.




