Qualcuno sa di un modo o ha un'implementazione per applicare TUTTE le classi che derivano da IEntityTypeConfiguration<>
a DbContext
in fase di runtime?
Sembra che non ci sia nulla di costruito e il caricamento di ciascuno manualmente tramite:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new Table1Config())
modelBuilder.ApplyConfiguration(new Table2Config())
...
modelBuilder.ApplyConfiguration(new TableNConfig())
}
si dimostrerà piuttosto noioso per un database con molte tabelle.
È possibile scrivere un metodo di estensione come segue:
public static class ModelBuilderExtensions
{
public static void ApplyAllConfigurations(this ModelBuilder modelBuilder)
{
var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetInterfaces()
.Any(gi => gi.IsGenericType && gi.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>))).ToList();
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.ApplyConfiguration(configurationInstance);
}
}
}
Quindi in OnModelCreating
come segue:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyAllConfigurations();
}
Da EF Core 2.2
non è necessario scrivere alcun metodo di estensione personalizzato. EF Core 2.2
aggiunto il metodo di estensione ApplyConfigurationsFromAssembly
a questo scopo. Puoi semplicemente usarlo come segue:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(UserConfiguration).Assembly); // Here UseConfiguration is any IEntityTypeConfiguration
}
Grazie.