En esta serie de post intentaré resumir los enfoques que hoy permite Entity Framework para crear nuestro modelo conceptual y resolver nuestras necesidades de persistencia.
Este post es más bien conceptual, puede contener algunos detalles prácticos, pero no pretende mostrar ejemplos ni guías paso a paso. En futuros post intentaré dar ejemplos prácticos sobre cada uno de estos enfoques.
Introducción
Actualmente con Entity Framework podemos elegir entre 3 enfoques diferentes para crear el modelo conceptual:
- Database First: El modelo conceptual se crea a partir de una base de datos existente.
- Model First: se crea el modelo conceptual y se genera la base de datos.
- Code First: nuevo a partir de EF 4.1. Un enfoque simplificado que permite mapear nuestras clases POCO a la base de datos usando convención, Data Annotations o Fluent API.
Este post estará dedicado al primer enfoque: Database First.
Database First
Este enfoque permite inferir un modelo de clases a partir del esquema de una base de datos existente.
Usando Visual Studio, podemos agregar un ítem de proyecto llamado Entity Data Model e iniciar un asistente para conectarnos a una base de datos, seleccionar los objetos que queremos incluir en el modelo (tablas, vistas, stored procedures) y generar un archivo .edmx que contiene una representación XML de:
- El modelo conceptual (CSDL – Conceptual Schema Definition Language)
- el modelo de datos (SSDL – Store Schema Definition Language)
- y el mapeo entre ambos modelos (MSL – Mapping Specification Language)
El siguiente gráfico muestra un ejemplo del contenido XML de un archivo .edmx:
Es importante entender que el modelo conceptual (CSDL) no debe ser necesariamente igual al modelo de datos (SSDL), y por ello existe el modelo de mapeo (MSL).
A partir de ese archivo .edmx, se genera automáticamente (usando plantillas T4) un archivo .edmx.designer.cs (.vb en el caso de VB.NET) que contiene las clases que representan a las entidades del modelo conceptual.
Puede observarse que estas clases heredan de EntityObject y tienen varios atributos y propiedades dependientes de EntityFramework.
Típicamente, se crea una clase (entidad) por cada tabla de la base de datos, incluyendo propiedades que se mapean a campos y las relaciones entre las tablas son representadas mediante propiedades de navegación.
Además de las clases de entidades se genera también una clase que hereda de ObjectContext y representa el contexto de base de datos. A través de esta clase tendremos acceso a las entidades y colecciones del modelo y podremos realizar todas las operaciones de lectura y escritura de datos desde y hacia la base de datos subyacente.
En el siguiente ejemplo, BookstoreEntities es la clase generada por EF que hereda de ObjectContext:
Luego podemos usarla para acceder al modelo:
¿Puedo modificar o extender las clases de entidades generadas por EF?
Las clases generadas en el archivo .designer son re-generadas cada vez que se actualiza el modelo en el archivo .edmx. En consecuencia, no podemos modificar o agregar código a esas clases. La buena noticia es que son clases parciales y podemos extenderlas en otro archivo o bien podemos usar herencia.
¿Qué pasa si la base de datos cambia?
Habrá que actualizar el modelo conceptual. Esto puede lograrse fácilmente a través del designer del edmx:
Se inicia el asistente de actualización en el cual podemos agregar nuevas tablas, vistas o stored procedures, refrescar las tablas existentes o eliminar otras.
Una vez finalizado el asistente, el archivo edmx se actualiza y se re-generan las clases de entidades. Luego habrá que actualizar el código que hace referencia a las entidades modificadas (si corresponde).
Conclusión
- El enfoque Database First nos permite generar rápidamente nuestro modelo de clases y mantenerlo sincronizado cuando el modelo de datos cambia.
- El archivo edmx contiene una definición XML del modelo conceptual (CSDL), el modelo de datos (SSDL) y el mapeo entre ambos.
- Las clases generadas heredan de EntityObject y se utiliza una clase que hereda de ObjectContext para administrar el modelo y realizar las operaciones de persistencia.
En los próximos post continuaré con los otros dos enfoques de Entity Framework (Model First y Code First), y hablaremos sobre las opciones de generación de entidades POCO, etc.
Espero que sirva, saludos.
~Gus
5 comentarios:
Muy bueno, muchas gracias.
Muy bueno el articulo, queda muy claro todo lo que explicas. He leído los 3 enfoques de EF y me parecen muy interesantes.
Sin duda usare uno de estos en mi próximo proyecto.
Gracias Gustavo por darte el tiempo de ayudar a entender estas tecnologías.
Saludos desde Chile.
Pedro
Muy buen articulo, sigue adelante compartiendo tus conocimientos.
Saludos desde Santa Cruz de la Sierra, Bolivia.
Excelente artículo, muy clara tu explicación. Gracias!
Excelente explicacion de todo; te hago una consulta, luego de actualizar el modelo con una nueva tabla de mi base de datos, no me genera la clase correspondiente a esa tabla, hay algún paso más que debo realizar?
Gracias
Publicar un comentario