Tecnocrata

June 2010 - Artículos

Entity Framework 4, Model-First, POCO, T4, Code-Only

Complementando el post de Luis Franco (http://geeks.ms/blogs/lfranco/archive/2010/01/12/mejoras-en-entity-framework-4.aspx), referido a las mejoras que trae EF4, hago mi aporte con un poco de mis experiencias y puedo decir que existen varias formas de usar EF4, entre ellas:

Primera - Tradicional

La manera tradicional y que proviene de EF1, DataBase-First, donde se parte de una base de datos existente, a partir de la cual se crean las entidades, modelo sostenible desde mi punto de vista, para aplicaciones pequeñas.

Con la aparición de EF4 (debería haber sido EF2, pero vamos!) y obviamente a raíz de pedidos airados de la comunidad, se introduce el desarrollo Model-First, donde a partir de un modelado de entidades se genera una base de datos, esta forma de usar EF es la más interesante, incluso si queremos verlo así va acorde con iniciativas como MDA, pero mas allá de esto, quizá lo interesante que trae EF, es que se puede aplicar Model-First, de variadas formas, he aquí las que yo he explorado.

Segunda – Model First Tradicional

Manera "nativa", esta consiste en crear un modelo .edmx vacio, he ir agregando las diversas entidades, sus atributos y sus relaciones y en algún momento del tiempo escoger una opción dentro del diseñador, que se llama "Generate Database from Model...", esto producirá una base de datos "compatible" con nuestro modelo, en realidad producirá un script (.sql) que luego puede ser ejecutado y generar la base de datos. http://blogs.microsoft.co.il/blogs/gilf/archive/2009/05/23/model-first-in-entity-framework-4.aspx
http://channel9.msdn.com/posts/Eric+Nelson/Entity-Framework-4-Part-1-Simple-Model-First/

clip_image002

Tercera – Model First con POCO y T4

La siguiente manera de usar Model-First, viene del descontento, de tener entidades que son dependientes de Entity Framework, esto ocurre incluso al usar la anterior opción, donde las entidades que se generan aun heredan de EntityObject una clase de EntityFramework, generando código similar al siguiente:

clip_image004

Y aunque han surgido otros “artificios” para tratar de eliminar esas dependencias en EF1, tales como IPOCO o IEntityObject, todas terminan introduciendo indirectamente una dependencia hacia Entity Framework.

En este sentido Microsoft introduce en EF la posibilidad de usar un concepto ya “antiguo” en otras plataformas, el concepto de POCO (Plain-Old-CLR-Object) que propugna tener objetos simples sin dependencias como las anteriores opciones, que en definitiva se conviertan en las entidades del modelo y a partir de estas clases se generara la base de datos.

Para lograr este propósito se vale de las plantillas de generación de código T4 (Text Templating Transformation Toolkit), para esto se utiliza una plantilla que aun no sé si esta en beta o no, no anda muy claro en VisualStudioGallery  (http://visualstudiogallery.msdn.microsoft.com/en-us/23df0450-5677-4926-96cc-173d02752313) Sin embargo esta opción de usar Model-First considera la posibilidad de reemplazar el generador por defecto por uno personalizado, que será el responsable de generar las clases POCO, personalmente esta opción me gusta, es bastante simple utilizarla, pero me trajo problemas cuando quiero hacer un uso semi-avanzado, por ejemplo usar enumeradores, para esto he tenido que personalizar el template T4 .tt, para que cumpla mis requerimientos. Esta opción se puede habilitar seleccionando la opción “Add code generation item….”

clip_image006

Esto permitirá seleccionar la plantilla que descargo del enlace anterior y obviamente que ya instalo.

clip_image008

Esto cambiara totalmente la forma en la que se generan las clases y eliminara las dependencias de estas clases de EntityFramework, en los siguientes enlaces podrán encontrar una guía paso a paso de cómo aprovechar esta forma de Model-First.

http://blogs.msdn.com/b/adonet/archive/2009/06/22/feature-ctp-walkthrough-poco-templates-for-the-entity-framework.aspx

Cuarta – Model First Limpio con Doble Trabajo

La cuarta forma de usar EF y la tercera de usar el Model-First, está un poco “escondida” a simple vista, la considero probablemente la más “limpia” de las formas de usar Model-First, sin embargo requiere más trabajo, esta consiste en crear dos librerías de clases una para las entidades y otra para el mapeo, la librería de las clases POCO, contendrá todas las clases TOTALMENTE planas, no se usa ningún generador, no se usa ninguna referencia hacia EntityFramework y el diseño de las clases puede hacerse usando un ClassDiagram de VS, luego en la librería de mapeo se agrega un modelo edmx, se lo libera de generar las clases de manera tradicional, eliminando el contenido de la propiedad CustomTool, como se muestra en la siguiente captura:

clip_image010

Se procede a referenciar a la librería de clases POCO y aquí viene el doble trabajo, hay que volver a modelar las mismas clases que se modelaron en la librería POCO, en el modelador EDMX, las entidades que se modelen en el modelador EDMX tienen que tener, el mismo nombre de clase, las mismas propiedades y sus mismos nombres, de lo contrario no funcionara, haciendo este doble trabajo de modelación, se logra una forma de Model-First mas limpia para aquellos que no gusten de los generadores, aquí también les dejo unos enlaces, lean el primero y luego váyanse a los demás, si analizan lo que se hace en el segundo enlace observaran que aunque no se hace exactamente lo que digo, bajándose el ejemplo podrán probar mas rápidamente esta característica

http://www.code-magazine.com/articleprint.aspx?quickid=0909081&printmode=true

http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx

http://blogs.msdn.com/b/adonet/archive/2009/05/28/poco-in-the-entity-framework-part-2-complex-types-deferred-loading-and-explicit-loading.aspx

Quinta – Model First con Code Only

La ultima forma de usar EF4 y fundamentalmente Model-First, no está totalmente evolucionada, como dicen sus autores, la llaman Code-Only y es bastante similar en concepto a NHFluent o Fluent NHibernate, es una forma que combina la creación del modelo con clases POCO y la definición de restricciones y relaciones por código, es una alternativa bastante poderosa si queremos evitar incluso los edmx, pero habrá que esperar algún tiempo antes de usarla en su totalidad. Aquí les dejo enlaces para que puedan explorar esta alternativa:

http://blogs.msdn.com/b/adonet/archive/2009/06/22/feature-ctp-walkthrough-code-only-for-the-entity-framework.aspx

http://blogs.msdn.com/b/efdesign/archive/2009/10/12/code-only-further-enhancements.aspx

http://blogs.msdn.com/b/efdesign/archive/2009/08/03/code-only-enhancements.aspx

Principales Observaciones a EF4

  1. Hasta el momento no he encontrado un mecanismo para preservar mis datos, en la base de datos, durante los ciclos de modificación del modelo y generación de la base de datos, en Model-First, es decir cada vez que genero una base de datos pierdo la información que tenia almacenada, bueno creo que este "inconveniente" no solo afecta a EF sino también a otros ORM como NHibernate y podemos decir que nace a partir de lo complicado que sería restaurar datos en una tabla, cuando esta ha cambiado drásticamente, pero me gustaría ver algunas sugerencias o soluciones a este inconveniente.
  2. Los enumeradores, benditos enumeradores!!!, deberían ser soportados en EF, se que se ha prometido en las siguientes actualizaciones hacerlo, pero la verdad que no sé cuándo será, mientras tanto hay que usar trucos como estos (http://blogs.msdn.com/b/alexj/archive/2009/06/05/tip-23-how-to-fake-enums-in-ef-4.aspx, http://devtalk.dk/CommentView,guid,d5dccc2a-5723-49b4-97d1-bf759b7f592d.aspx), para saltarnos este otro inconveniente, hasta que nativamente tengamos soporte a enumeradores, creo yo como tipos complejos, que opinan Uds.?
  3. El soporte completo para los GUIDs como llaves primarias es otro aspecto que observo ausente en EF4, aun hay que hacer “cosas” extrañas para poder tener una generación automática de Guids, espero que en la siguiente versión se tenga algo nativo

http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

http://geekswithblogs.net/danemorgridge/archive/2010/02/12/guids-as-primary-keys-with-entity-framework-4.aspx

Espero que les sirva este conjunto de experiencias, un abrazo

Ecuaciones del aprendizaje

Hoy estuve “meditando” sobre las diferentes formas de aprendizaje, que he visto en nuestra profesión de desarrolladores y bueno principalmente en mi país, quizá alguno quiere compartir opiniones adicionales?

aprendizaje_efectivo=lectura_teoria+ejemplo_practico+re_lectura_teoria;

El aprendizaje efectivo solo lo hacen los fuertes de voluntad y carácter, una vez leída la teoría, muy pocos quieren o desean volver a leerla. Sin embargo los que lo practican, tienen asegurado un retorno de la “inversión” con creces.

aprendizaje_empirico=ejemplo_practico;

Este aprendizaje es propio de los que no tienen una formación “formal” han aprendido las “artes” viendo y aplicando. Personalmente le atribuyo a este aprendizaje, las grandes deficiencias de los profesionales junior.

aprendizaje ligero=lectura_teoria+ejemplo_practico;

Este es el aprendizaje común, con el que muchos se satisfacen porque lo consideran más que suficiente, probablemente suficiente para entablar una conversación, pero no para enseñar por ejemplo.

aprendizaje_teorico=lectura_teoria+re_lectura_teoria;

Definitivamente el aprendizaje que no veremos en una empresa que produce “algo”, y bueno yo he visto este aprendizaje lamentablemente en varios docentes de las universidades de mi país. Probablemente un aprendizaje valido pero no útil para enseñar.

En estas “ecuaciones” de aprendizaje, quizá faltan mas variables o quizá hay mas tipos de aprendizaje, veamos….

Secuestraron mi puerto 80!

Hoy me ocurrieron varios errores misteriosos dentro del laburo, uno de ellos, al iniciar mi computadora con Windows 7, no se levantaba el servicio de IIS, dándome el siguiente error

The WWW Service did not register the URL prefix http://*:80/ for my site

Según todos los datos, el Puerto 80 estaba secuestrado por “alguien” más, lo cual no dejaba que se inicie correctamente el IIS, Estuve como 30 minutos desperdiciando mi tiempo en encontrar una solución porque no había un claro indicador de “quien” era el que se había apropiado de mi puerto 80, por mi mente paso incluso el deseo de reinstalar el IIS pero tenía demasiadas configuraciones que no podían ser restauradas en un tiempo razonable.

Hasta que me tope con un comentario de una persona que me pregunto si usaba Skype y válgame….. Eso era! Skype se había apropiado de una manera extraña de mi puerto 80, lo único que hice fue desmarcar la opción como se muestra a continuación y listo.

clip_image002

Espero que esto le sea de ayuda a alguien más para que no desperdicie 30 valiosos minutos en una búsqueda en internet.

Saludos