Buscar este blog

lunes, 16 de junio de 2014

Separar la capa de dominio de un EDMX

Introducción

Entity Framework (EF) es un asignador objeto-relacional que permite a los desarrolladores de .NET trabajar con datos relacionales usando objetos específicos del dominio. Elimina la necesidad de la mayor parte del código de acceso a datos que los desarrolladores suelen tener que escribir.
Para empezar debemos definir si vamos a crear una nueva base de datos o si vamos a usar una existente, y definir si queremos usar solo código o utilizar un diseñador.
Lo anterior nos proporciona tres puntos de partida posibles:
  • Code First: Definir el modelo en el código y después generar una base de datos, o sino, crear un código basado en el modelo que se asigna a una base de datos existente
  • Model First: Para definir el modelo con cuadros y líneas y después generar una base de datos
  • Database First: Para crear un modelo de cuadros y líneas que se asigna a una base de datos existente
Tanto Model First como Database First usan Entity Framework Designer. El modelo se almacena en un archivo EDMX (extensión .edmx) y se puede ver y editar en Entity Framework Designer. Las clases con las que interactúa en la aplicación se generan automáticamente a partir del archivo EDMX en base a Plantillas T4 vinculadas al archivo EDMX
El problema radica en el fuerte acoplamiento de las clases generadas del modelo y Entity Framework, haciendo imposible tener una capa exclusiva para el dominio, y otra para la persistencia.
En este artículo demostraremos que si es posible hacerlo, simplemente trasladando la Plantilla T4 de las clases al proyecto adecuado
Para tal fin empezaremos con el el enfoque Model First, ya que la idea es tener un archivo EDMX, y se aplicaría también para Database First

Definiendo Proyectos

Empezaremos creando la estructura de proyectos:
  • Dominio: Ejemplo.Dominio
  • Acceso a Datos: Ejemplo.Dal
  • Presentación: Ejemplo.WinForms

Definiendo el Modelo

En el proyecto "Ejemplo.Dal", crearemos el modelo
Definimos un modelo muy básico, basado en los códigos de ubicación geográfica del Perú

Generando Base de Datos

En este punto ya es posible generar nuestra base de datos, así que vamos a hacerlo de una buena vez.
Hacemos click en nueva conexión, para generar nuestra nueva base de datos, si la conexión ya existiese, pues la eligen, y se sobreescribirá con los cambios al modelo, Ojo!! que si sobreescriben el modelo, también pierden los datos de las tablas modificadas.
Configuramos la conexion como se muestra en la siguiente imagen:
Nos aparecerá un mensaje de que la base de datos no existe y si deseamos crearla, le decimos que si, y listo.

Ahora le damos en siguiente, y si te pregunta, que Entity Framework quieres usar, escoge la que se adecue a tus necesidades, para mi caso escogeré la versión 6
Ya tenemos el Script de actualización/creación de la base de datos
Le damos en finalizar, y nos abrirá una ventana de consulta SQL, la misma que debemos ejecutarla, presionando el botón que resalto a continuación:


Separando Clases POCO del EDMX

Bien, ahora ya podemos hacer uso de nuestra base de datos, operaciones CRUD, Extensión de clases a través de las clases parciales, pero el problema radica, como se menciono anteriormente, en que los archivos de las clases están "Confinados" a estar junto al archivo EDMX, como lo vemos? pues mostrando todos los archivos:
Como se aprecia, de Modelo.edmx, cuelgan varias plantillas T4, una de ellas es Modelo.tt, de Modelo.tt cuelgan todas nuestras clases!! Esto hace que estas clases estén condenadas, según este esquema, a quedarse pegadas al edmx, y para poder usarlas necesariamente tendríamos que cargar con la mochila de Entity Framework, pero ahora viene el punto interesante de este artículo.
Vamos a copiar Modelo.tt al proyecto Ejemplo.Dominio, para eso agregamos una nueva plantilla a nuestra capa de dominio, y la llamamos Modelo.tt
Y reemplazamos su contenido por el del Modelo.tt que esta en la capa Dal.
Las plantillas T4 se ejecutan automáticamente al guardarlas, así es que cuando guarden esta nueva plantilla, tendrán un bonito mensaje de error como este:
Que paso?, pues simplemente, el contenido de la plantilla T4 sigue suponiendo que su EDMX se llama Modelo.EDMX y esta en la misma carpeta, pues entonces vamos a redireccionarlo.
Pensando un poquito, de acuerdo a la estructura de los proyectos, si tenia "Modelo.edmx" y necesito que suba una carpeta y luego vaya a "Ejemplo.dal", la ruta seria "..\Ejemplo.Dal\Modelo.edmx".
Y si guardamos ahora la plantilla, ya no debería salir ningún error, prueba de esto es que si mostramos todos los archivos en nuestra capa de dominio, veremos todas las clases de nuestro modelo
El trabajo estaría casi listo, pero como sabemos, la capa de persistencia debe tener la referencia a la capa de dominio, entonces se la agregamos

Ahora debemos de eliminar Modelo.tt de la capa de persistencia, simplemente click derecho y eliminar.
En este momento debería aparecer una serie de errores como estos:

Esto ocurre simplemente porque en la plantilla que genera el archivo Modelo.Context.vb falta agregar el import respectivo a la capa de dominio, entonces pasemos a "reparar" Modelo.Context.tt

Como ven, simplemente le agregue el import a Ejemplo.Dominio, y si guardan la plantilla dejaran de recibir esos errores
Ahora, la capa de Presentación debe tener referencia a la de dominio, entonces agregamos la de dominio a la de presentación

Claro esta, que entre la capa de dominio y la de presentación pueden y deben haber mas capas; del mismo modo, entre la capa de dominio y la de persistencia de datos, pueden y deben haber mas capas; por ejemplo si te decantas por DDD
Con lo visto hasta aquí, la capa de dominio ha quedado libre de cualquier referencia a entity framework, y esta apta para ser ampliada mediante clases parciales y usada en cualquier capa de toda la arquitectura escogida.
Espero les sea de ayuda en algún proyecto, y para la próxima entrega, implementaremos una capa de servicios para consumir datos desde la capa de persistencia.






No hay comentarios.: