EF 6: Estableciendo las configuraciones de forma automática

La verdad es que no hace muchos días que publiqué un post con este trabajo para todos aquellos, que como yo, consideraran interesante el hecho de disponer de una forma automática de agregar las configuración de nuestro modelo, con el fin de facilitar el trabajo y prevenir ese código repetitivo que solemos ver muy a menudo. Para que no tengamos que recurrir a lo mismo en EF 6, me decidí por hacer un pequeño pull request que pudiera contener esta funcionalidad, ahora, que como ya sabréis todos, Entity Framework es Open Source  y, por lo tanto, abierto a que la comunidad pueda contribuir. Los que hayáis pasado alguna vez por el portal del proyecto en Codeplex sabréis que hay multitud de información sobre las diferentes vías de contribución, que no tienen porque ser solamente código, y como hacer estas contribuciones de una forma ordenada y consensuada. La palabra consensuada es importante aquí puesto que por mucho que a nosotros nos parezca importante y válida una contribución esta no tiene por que tener la misma validez para el equipo, por ejemplo, porque la pieza o piezas en las que vayamos a tocar se vayan a rediseñar o, a otra multitud de factores que se nos puedan escapar. El principio Don’t Push Your Pull Request es la norma a seguir dentro del equipo de desarrollo y por lo tanto el primer trabajo que tenemos que hacer es discutir con ellos lo que queremos hacer y por supuesto como lo vamos a hacer, en este caso, la sugerencia de pull request y su discusión la podéis ver aquí.

Bueno, después de ver el feedback y de las guías sobre como les gustaría la aportación, el resultado que ha quedado es este Change Set con la característica comentada anteriormente y, que pasaremos a desgranar ahora mismo.

 

Carga automática de configuraciones

 

Bien, esto es lo más básico y a la vez lo más natural de esta característica, puesto que como ya comentamos su primer trabajo es hacer la carga de configuraciones de forma automática, eliminando las típicas líneas repetitivas de carga de configuraciones, que en un proyecto real serán muchas y por lo tanto con un impacto en legibilidad y mantenibilidad. Es decir, lo que nos permitiría es cambiar cosas como esta:

 

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //.. more configurations entries

            modelBuilder.Configurations.Add(new OrderEntityTypeConfiguration());
            modelBuilder.Configurations.Add(new CustomerEntityTypeConfiguration());

            //.. more configurations entries
        }

Por lo siguiente:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
        }
 

Visibilidad de tipos y constructores

 

Para realizar esta carga automática de configuraciones no estamos restringidos a ninguna visibilidad de nuestras clases, ni de sus constructores. De hecho, esto es lo ideal, puesto que estas clases solamente tienen fines de configuración y no están pensadas para ser usadas más que por la infraestructura, parece lógico que pudiéramos escribirlas como por ejemplo en la siguiente de forma no pública y con un constructor privado.

 

   class OrderEntityTypeConfiguration
        :EntityTypeConfiguration<Order>
    {
        private OrderEntityTypeConfiguration()
        {
            this.Property(o => o.Total).HasPrecision(12, 2);
        }
    }

 

Configuraciones en jerarquía

 

La última de las características de este trabajo, es el soporte a jerarquías de configuraciones, es decir, que nuestros tipos de configuración no implementen de forma directa EntityTypeConfiguration<>. Un ejemplo de este tipo de escenarios podría ser algo como lo siguiente:

 

    abstract class CommonEntityTypeConfiguration<TEntity>
        :EntityTypeConfiguration<TEntity> where TEntity:class
    {
        public CommonEntityTypeConfiguration()
        {
            string tableName = PrefixTableName(typeof(TEntity).Name);

            this.ToTable(tableName);

        }

        string PrefixTableName(string name)
        {
            return "tbl" + name;
        }
    }

Si observa, lo que hemos hecho, con meros fines de ejemplo, es hacer una pequeña base para nuestras configuraciones que nos agrega un prefijo tbl a los nombres de nuestras tablas. Esta configuración base la podríamos utilizar en todas aquellas entidades que nos interesaran que ya tuvieran OOB esta característica.

 

    class OrderEntityTypeConfiguration
        : CommonEntityTypeConfiguration<Order>
    {
        private OrderEntityTypeConfiguration()
        {
            this.Property(o => o.Total).HasPrecision(12, 2);
        }
    }

Pues bien, como hemos dicho, aún en estas situaciones nuestro AddFromAssembly seguirá funcionando perfectamente y cargando nuestras configuraciones de la forma correcta, excluyendo tipos abstractos y definiciones de tipos genéricos…

 

Bueno, espero que os resulte interesante esta novedad que tendremos en EF 6 y espero, que esta contribución os sea de la mayor utilidad posible, con ese fin está hecha…

 

saludos

Unai

Published 7/12/2012 11:07 por Unai
Comparte este post:
http://geeks.ms/blogs/unai/archive/2012/12/07/ef-6-estableciendo-las-configuraciones-de-forma-autom-225-tica.aspx

Comentarios

# EF 6: Pluralization Service ahora es un servicio público

Esta ‘pequeña feature’ era algo que tenía en mente hacer desde hace tiempo, después de otros pull request

Tuesday, January 8, 2013 1:00 AM por O bruxo mobile

# Entity Framework 6: Alpha 2 ya disponible

¿Eres de los que siempre les gusta probar las betas y alphas nuevas según salen para ver

Wednesday, January 9, 2013 3:41 PM por MSDN España