Come posso cambiare la convenzione di denominazione della tabella molti-a-molti generata automaticamente?
Supponiamo che io abbia due classi:
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; }
}
Per impostazione predefinita, verrà creata una tabella denominata UserRoles .
Posso cambiare il nome di quella tabella per UsersInRoles, ad esempio, utilizzando il seguente nella esclusione OnModelCreating della mia DbContext:
modelBuilder.Entity<User>()
.HasMany(p => p.Roles)
.WithMany(p => p.Users)
.Map(mc =>
{
mc.MapLeftKey("UserId");
mc.MapRightKey("RoleId");
mc.ToTable("UsersInRoles");
});
Tuttavia, quello che voglio veramente fare è cambiare la convenzione di denominazione in modo che, per impostazione predefinita, tutte le tabelle molti-a-molti generate automaticamente utilizzino questa nuova convenzione. Non riesco a capire come farlo, o se è anche possibile. Non mi piace dover specificare 9 righe di codice extra ogni volta che si specifica una di queste relazioni.
Attualmente sto usando la versione EF 6.0.0-rc1.
La capacità di controllare le relazioni è stata rimossa dall'API delle convenzioni di base prima del rilascio perché non era in uno stato utilizzabile. È possibile accedere a tutte le proprietà e le tabelle nel modello tramite convenzioni basate su modelli. Una panoramica delle convenzioni basate sul modello è disponibile qui: http://msdn.microsoft.com/en-US/data/dn469439
Questa soluzione richiede un po 'più di scavare nell'API dei metadati, EntitySet è il tipo corretto per questo scenario
Questa convenzione dovrebbe rinominare la tabella delle relazioni generate:
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";
}
}
}