Otra pequeñita entrada para mostrar otro método de utilidad que tendremos en EF 6.1, versión que pronto estará con nosotros. En este caso nos ocuparemos de la carga de convenciones, que como sabéis hasta ahora solamente se podía realizar mediante los métodos Add, AddAfter y AddBefore. Puesto que puede ser habitual la creación de un número significante de convenciones el incluir estas llamadas en nuestro OnModelCreating puede resultar en “código repetitivo”. Para simplificar esta tarea, ConventionsConfiguration dispone ahora de un método AddFromAssembly que nos permite cargar de forma automática todas las convenciones que tengamos en un determinado ensamblado. Concretamente, el método creado es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="rem">/// <summary></span> <span class="rem">/// Discover all conventions in the given assembly and add them for the <see cref="DbModelBuilder" />.</span> <span class="rem">/// <remarks></span> <span class="rem">/// This method add all conventions ordered by type name.The order in which conventions are added </span> <span class="rem">/// can have an impact on how they behave because it governs the order in which they are run.</span> <span class="rem">/// </remarks></span> <span class="rem">/// </summary></span> <span class="rem">/// <param name="assembly">The assembly containing conventions to be added.</param></span> <span class="kwrd">public</span> <span class="kwrd">void</span> AddFromAssembly(Assembly assembly) { Check.NotNull(assembly, <span class="str">"assembly"</span>); var types = assembly.GetAccessibleTypes() .OrderBy(type => type.Name); <span class="kwrd">new</span> ConventionsTypeFinder().AddConventions(types, convention => Add(convention)); } |
Es importante notar que como la ejecución de las convenciones se hace en orden de registro la carga automática de convenciones de un ensamblado impone un orden implícito basado en el nombre del tipo que representa la convención como se puede observar con el uso del método extensor OrderBy.
La selección de convenciones válidas se hace mediante el uso de un pequeño filtro, tal cual el siguiente, que nos permite registrar convenciones de modelo, almacén y de configuración.
1 2 3 4 5 6 7 8 9 10 |
<span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">bool</span> IsConvention(Type conventionType) { <span class="kwrd">return</span> IsConfigurationConvention(conventionType) || IsConceptualModelConvention(conventionType) || IsConceptualToStoreMappingConvention(conventionType) || IsStoreModelConvention(conventionType); } |
El pull request asociado a esta característica en la que podéis ver todos los cambios necesarios es este. Espero que os resulte interesante y sobre todo útil, puesto que para esto se ha hecho!!
saludos
Unai