EF 4.1 Code First - OnModelErstellen der Anrufzeit

8

Wenn ich meine Anwendung debugge, scheint diese Methode nicht im Konstruktorkontext von DbContext ausgeführt zu werden. Also wann heißt es dann?

    
rovsen 12.04.2011, 11:20
quelle

3 Antworten

8

Diese Methode wird aufgerufen, wenn EF zum ersten Mal auf die Datenbank zugreifen muss (also nicht während der Kontext-Instanziierung). Wenn die Datenbank nicht existiert, verwendet sie Informationen aus dem kompilierten Modell, um sie zu erstellen. Das Modell wird nur einmal pro Anwendung erstellt (es wird intern zwischengespeichert). Selbst wenn Sie den Kontext verwerfen, wird Ihr Modell für die nächste Instanz wiederverwendet.

    
Ladislav Mrnka 12.04.2011, 18:29
quelle
30

Um es klar zu sagen, OnModelCreating hat nichts damit zu tun, ob EF die Datenbank für Sie erstellt oder nicht.

Um mit der Datenbank interagieren zu können, muss Entity Framework ein Modell der Entitäten erstellen, die persistent bleiben. Wenn dieses Modell nicht bereits erstellt und zwischengespeichert wurde, wird dieses Ereignis ausgelöst.

Nachdem das Modell erstellt wurde, wird daraus ein Hash generiert, und EF versucht dann, eine Verbindung zur Datenbank herzustellen, um zu sehen, ob (a) es existiert, (b) es Versionsinformationen enthält, a vorherigen Hash, der in der EdmMetadata-Tabelle gespeichert ist, und (c) ob dieser Hash mit dem zuvor aus dem Modell berechneten übereinstimmt oder nicht.

Wenn die Hashwerte nicht übereinstimmen, verwendet EF den initialisierten Datenbankinitialisierer (durch Aufrufen von Database.SetInitializer(new SomeInitializerType() ), der die Datenbank möglicherweise löschen, erstellen oder anderweitig ändern kann. Der Standardinitialisierer, der verwendet wird, wenn Sie keinen anderen angeben, hat keinen Einfluss auf Ihre Datenbank. Nach der Ausführung verweigert Entity Framework die Interaktion mit der Datenbank, wenn sie nicht synchron ist.

Wenn Ihre Datenbank keine EdmMetadata-Tabelle mit einem Hash enthält, geht Entity Framework davon aus, dass Sie das Datenbankschema selbst verwalten und glücklich versuchen, es zu nutzen, in der Hoffnung, dass Sie die richtigen Dinge gefunden haben. Wenn das Schema später nicht mit den Erwartungen von EF übereinstimmt, erhalten Sie Fehler beim Aufruf von SaveChanges () und so.

In allen diesen Szenarios wird das OnModelCreating-Ereignis beim ersten Mal, wenn Entity Framework benötigt wird, unabhängig davon ausgelöst, ob Sie Ihr eigenes Datenbankschema verwalten oder EF nach Bedarf löschen und neu erstellen zu wissen, was es aushält.

    
Brandon Roberson 31.05.2011 00:35
quelle
-2

OnModelErstellt Auslöser, wenn EF4 die Datenbank erstellt. Normalerweise wird dieses Ereignis verwendet, um die Art und Weise zu konfigurieren, wie EF4 die Datenbank generiert. Wenn Sie Ihre Anwendung also zuvor ausgeführt haben und Ihr Modell gleich bleibt, ist die Datenbank bereits vorhanden und EF4 versucht nicht, eine neue zu erstellen (obwohl dieses Verhalten auch davon abhängt) einige Konfigurationsparameter).

    
Alejandro Martin 12.04.2011 11:46
quelle