¿Cómo cambiar la convención de nomenclatura de las relaciones de tabla de muchos a muchos?

ef-code-first entity-framework entity-framework-6

Pregunta

¿Cómo puedo cambiar la convención de nomenclatura de la tabla de muchos a muchos generada automáticamente?

Supongamos que tengo dos clases:

public class User
{
    public int UserId { get; set; }
    public virtual List<Role> Roles { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public virtual List<User> Users { get; set; }
}

Por defecto, esto creará una tabla llamada UserRoles .

Puedo cambiar el nombre de aquella mesa para UsersInRoles, por ejemplo, mediante el uso de lo siguiente en la anulación de mi OnModelCreating DbContext:

public class User
{
    public int UserId { get; set; }
    public virtual List<Role> Roles { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public virtual List<User> Users { get; set; }
}

Sin embargo, lo que realmente quiero hacer es cambiar la convención de nomenclatura para que, de forma predeterminada, todas las tablas de muchos a muchos generadas automáticamente utilicen esta nueva convención. No puedo averiguar cómo hacerlo, o si es posible. No me gusta tener que especificar 9 líneas de código adicional cada vez que especifico una de estas relaciones.

Actualmente estoy usando EF versión 6.0.0-rc1.

Respuesta aceptada

La capacidad de controlar las relaciones se eliminó de la API de convenciones básicas antes del lanzamiento porque no estaba en un estado utilizable. Puede acceder a todas las propiedades y tablas en el modelo a través de convenciones basadas en modelos. Una descripción general de las convenciones basadas en modelos está disponible aquí: http://msdn.microsoft.com/en-US/data/dn469439

Esta solución implica un poco más de investigación en la API de metadatos, EntitySet es el tipo correcto para este escenario

Esta convención debería cambiar el nombre de la tabla de relación generada:

public class MyConvention : IStoreModelConvention<EntitySet>
{
    public void Apply(EntitySet set, DbModel model)
    {
        var properties = set.ElementType.Properties;
        if (properties.Count == 2)
        {
            var relationEnds = new List<string>();
            int i = 0;
            foreach (var metadataProperty in properties)
            {
                if (metadataProperty.Name.EndsWith("_ID"))
                {
                    var name = metadataProperty.Name;
                    relationEnds.Add(name.Substring(0, name.Length - 3));
                    i++;
                }
            }
            if (relationEnds.Count == 2)
            {
                set.Table = relationEnds.ElementAt(0) + "_" + relationEnds.ElementAt(1) + "_RelationTable";
            }
        }
    }



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué