EF Agregando configuraciones de forma automática
Hay ciertas situaciones en las que las convenciones de EF para nuestros mapeos de entidades no nos sirven o bien no nos sirven completamente, un ejemplo de esto es cuando trabajamos con una base de datos existente, dónde, seguramente, la convención del nombre de las tablas ( pluralización en inglés de los nombres de las entidades ) no nos sirva, y así con otras muchas convenciones. En estas situaciones, es más que seguro que tengamos que hacer uso de las configuraciones personalizadas, instancias de EntityTypeConfiguration<> y ComplexTypeConfiguration<>. En estos casos, cuando el modelo es grande, el aspecto que tendrá nuestro OnModelCreating será un poco esperpéntico, algo similar a lo siguiente:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configuration.Add(new Entiti1Configuration());
modelBuilder.Configuration.Add(new Entiti2Configuration());
modelBuilder.Configuration.Add(new Entiti3Configuration());
modelBuilder.Configuration.Add(new Entiti4Configuration());
...
...
...
modelBuilder.Configuration.Add(new Entiti20Configuration());
modelBuilder.Configuration.Add(new Entiti21Configuration());
modelBuilder.Configuration.Add(new Entiti22Configuration());
modelBuilder.Configuration.Add(new Entiti23Configuration());
}
El problema de este tipo de códigos, amén del matenimiento, es la poca legibilidad del mismo, donde por ejemplo, nos costaría encontrar si una entidad está o no mapeada. Solventar este problema y hacer un código más legible y facilitar la vida al desarrollador no es difícil, ya que en realidad lo único que estamos haciendo ahí es configurar todas las clases de un determinado tipo, algo por lo tanto muy fácil de automatizar. En el siguiente repositorio de GitHub he implementado una posible solución para estos problemas, que nos permite cambiar este código anterior por algo como lo siguiente:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(ConfigurationSolver.FromThisAssembly());
}
o, si tenemos los mapas de configuración en otro ensamblado, podríamos hacer:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(ConfigurationSolver.FromNamedAssembly("The_Assembly_With_Configs"));
}
Espero que os guste y, sobre todo, que os sea de utilidad…
Saludos
Unai