0

Ich versuche, ein Modell mit Klassen in verschiedenen Baugruppen abgeleitet zu erstellen. Wenn ich dies ohne Reflektion mache, ist alles in Ordnung: Die Migration wird erfolgreich erstellt und die Datenbank wird aktualisiert.Entity Framework-Modell mit Reflexion erstellen

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<DerivedClass>(); 
} 

Wenn ich die Reflexion verwende, wird die Migration ohne Änderungen erstellt.

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[] { }); 
     } 
    } 
} 

Aber wenn ich Anwendung im Debug-Modus starte, sehe ich, dass diese Entität zu ModelBuilder hinzugefügt wird! Und Anwendung sagt, dass

Das Modell der ‚EFDbContext‘ Kontext Sicherung geändert hat, da die Datenbank

Antwort

1

erstellt wurde, ist, wie es sein soll. Was du mit Reflektion machst, ist eine Laufzeit Sache. Wer weiß, wie viele Assemblys Sie zur Laufzeit in der App-Domain haben?

Gerüst eine Migration mit EF-Migrationen ist eine Designzeit Sache. Es kann nur mit dem funktionieren, was es zu diesem bestimmten Zeitpunkt sieht, wenn Sie die Migration tatsächlich durchführen. Ein Tool, das zur Entwurfszeit ausgeführt wird, kann nicht berücksichtigen, was zur Laufzeit passieren wird oder nicht.

Wenn Sie Ihr Datenmodell dynamisch zur Laufzeit konfigurieren, denke ich, dass die einzige Möglichkeit darin besteht, Ihre leere Migration zu verwenden, um auch manuell reflektionsbasierten Code hinzuzufügen.