Desde que el EF (EntityFramework) se liberó, este ha ayudado a muchos desarrolladores a simplificar su trabajo cuando de mapear bases de datos se trata, el trabajo es mucho más simple y el desarrollo de interfaces también se vio beneficiado con el uso de los DataAnnotations (DA).

Empecemos explicando a grandes rasgos que es son los DataAnnotations: son clases de atributos que proporciona el espacio de nombres System.ComponentModel.DataAnnotations las cuales se usan para definir los metadatos para ser consumidos por ASP.NET MVC y los controles ASP.NET, vamos a ver un ejemplo sencillo de DA en un modelo:

13

En el código anterior podemos observar como los DA extienden la información del modelo, y podemos ver las vistas que utilizan la información de los DA para ser utilizada; cuando utilizamos Code First, todo parece ir de maravilla y tenemos el control total de los DA utilizado en nuestro código, ahora tenemos que en muchos casos tenemos diseñada la base de datos con anterioridad por lo tanto nuestra opción es DataBase First y utilizamos una entidad de modelado de datos, ADO.NET Entity Data Model y esta opción si bien esta herramienta es espectacular y todo lo genera utilizando unas plantillas tt y las clases aparecen por arte de magia nuestra dificultad radica en que ya no tenemos el control de los DA, y si los agregamos sobre las clases estos desaparecen si necesitamos hacer alguna modificación en la base de datos o si simplemente le damos guardar a la plantilla tt, pero por suerte existe una manera de solventar este problemita y este post nos guiará en un paso a paso para poder realizarlo, también encontraremos el código de ejemplo disponible para descarga.

Ahora vamos veamos una solución muy práctica para que los DA no se eliminen cuando se actualiza la plantilla.

  1. Agregamos un nuevo ADO.NET Entity Data Model


  2. Después de seguir el asistente vamos a conectar a la base de datos que he utilizado para el demo la cual se encuentra en la descarga de la demostración, seleccionamos la tablas de la base de datos y encontramos la siguiente estructura.


  3. En el explorador de solución podemos ver los archivos que se crearon con el modelo y podemos ubicar dos archivos con extensión .tt, el primero context.tt es la plantilla para la conexión a la base de datos y la segunda plantilla es la que permite crear las clases luego de ser mapeadas de la base de datos, en nuestro caso nos concentraremos en este archivo que en para efectos de este demo se llama: DataBaseModel.tt


  4. Al abrir este archivo en nuestro editor procedemos a realizar unos cambios, los cuales son necesarios para realizar con éxito nuestra labor, ubicamos la siguiente porción de código y agregamos la siguiente línea de esta manera:


    Insertamos la siguiente línea de código:

    <#=codeStringGenerator.EntityMetaDataType(entity)#>

    Y nuestro código se verá así ahora.


  5. A continuación, ubicamos la siguiente línea de código:


    Y procedemos a insertar el siguiente código:

    public
string EntityMetaDataType(EntityType entity)

{

    return
string.Format(

    CultureInfo.InvariantCulture,

    “[MetadataType(typeof({0}_Metadata))]”,

    _code.Escape(entity));

}

Nuestro nuevo código se verá así:


  1. Ahora hacemos la última modificación a la plantilla, ubicamos el siguiente código.


    Y lo reemplazamos con el siguiente código, los cambios son los marcados:


    Le damos guardar a la plantilla y el cambio se hará evidente en las clases que genera, la primera imagen muestra la clase antes de la modificación de la plantilla y la segunda la clase después de modificar la plantilla.


    Clase Modificada


  2. El siguiente paso es crear una clase donde estableceremos los DA manual menta esta clase contendrá los metadata de todas las clases mapeadas por el modelo, en nuestra demostración creamos el archivo, DataBaseModelMetada.cs y se verá así:


    Aquí podemos ver que ahora los DA se escriben en una clase Metadata que se enlaza al modelo usando la propiedad MetadataType, para complementar el proceso solo debemos poner las propiedades del modelo con sus respectivas anotaciones, estas propiedades deben ser de tipo object; si la clase no tiene DA del modelo igual debemos crearla aún con los campos vacíos, ahora no ya tienes el control de los DA y la plantilla .tt no los eliminará al recrearlos.

    Espero este post sea de utilidad y ya saben dónde encontrarme.


Descargar código fuente: Demo

 

Anuncios