Sto cercando di creare un modello con classi derivate in diversi assembly. Quando faccio questo senza riflessione, l'evething è OK: la migrazione viene creata con successo e il database viene aggiornato.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<DerivedClass>();
}
Quando utilizzo il reflection, la migrazione viene creata senza modifiche.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var entityMethod = typeof(DbModelBuilder).GetMethod("Entity");
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var entityTypes = assembly
.GetTypes()
.Where(t =>
t.BaseType == typeof(GameOperation));
foreach (var type in entityTypes)
{
entityMethod.MakeGenericMethod(type)
.Invoke(modelBuilder, new object[] { });
}
}
}
Ma quando lancio l'applicazione in modalità di debug, vedo che Entity si aggiunge a modelBuilder! E l'applicazione dice questo
Il modello che supporta il contesto 'EFDbContext' è cambiato da quando è stato creato il database
È così che dovrebbe essere. Quello che stai facendo con la riflessione è una cosa runtime . Chissà quanti assembly hai nell'appdomain in fase di runtime?
Impalcatura di una migrazione con migrazioni EF è una cosa del tempo di progettazione . Può funzionare solo con quello che vede in quel momento specifico, quando in realtà impalcatura la migrazione. Uno strumento che viene eseguito in fase di progettazione non può prendere in considerazione ciò che succederà o non accadrà in fase di esecuzione.
Se configuri il tuo modello di dati dinamicamente in fase di runtime, penso che l'unico modo sia di usare la tua migrazione vuota aggiungendo anche il codice basato sulla riflessione in quello manualmente.