Wo soll ich Database.EnsureCreated platzieren?

8

Ich habe eine Entity Framework Core + ASP.NET Core-Anwendung, und wenn meine Anwendung gestartet wird, möchte ich sicherstellen, dass die Datenbank erstellt wird und eventuell (sobald ich Migrationen habe) möchte ich sicherstellen, dass diese auch ausgeführt werden.

Anfangs habe ich Database.EnsureCreated() in den Konstruktor von DbContext eingefügt, aber das scheint jedes Mal zu laufen, wenn jemand meine Anwendung anspricht, da jedes Mal eine neue Instanz von DbContext erstellt wird.

Ich habe versucht, es in meinen Startup-Code zu schreiben, aber ich brauche eine Instanz von meinem DbContext , um das zu tun, und es ist unklar, wie genau man einen bekommt. Ich konfiguriere EF so:

%Vor%

Ich sehe keinen Weg, eine Instanz des DbContext aus der Service-Sammlung zu bekommen, und ich sehe kein passendes Singleton, um einen DbContext einzufügen, damit ich eine einmalige Initialisierung machen kann.

Also, was ist der beste Ort, um sicherzustellen, dass Code, der zu meinem DbContext gehört, einmal pro Anwendungslauf aufgerufen wird?

    
Micah Zoltu 30.04.2016, 17:58
quelle

3 Antworten

3

Zum Zeitpunkt dieses Schreibens gibt es keinen "richtigen" Ort, um Code beim Start der Anwendung auszuführen, so dass er innerhalb des Anforderungsbereichs ausgeführt wird (siehe Ссылка ).

Für den Moment besteht die Problemumgehung darin, Folgendes zu tun, aber es wird nicht in komplexeren Szenarien mit mehreren Anwendungen funktionieren (siehe Ссылка )

%Vor%     
Micah Zoltu 30.04.2016 18:27
quelle
3

Ich frage mich, warum Sie laufen würden, um EnsureCreated trotzdem als Teil Ihres Dienstes auszuführen. Wollen Sie wirklich, dass Ihr Webserver das Datenbankschema erstellt oder aktualisiert? Warum sollte der Webserver hochgefahren sein und eine Anfrage stellen, wenn die Datenbank nicht auf dem neuesten Stand ist?

Glauben Sie Ihren Migrationen wirklich so sehr, dass sie bei der Ausführung keine Daten ruinieren, dass Sie die Daten nach dem Ausführen nicht testen wollen?

Darüber hinaus müssen Sie der Webserver-Datenbank Benutzerberechtigungen erteilen, um das Datenbankschema zu ändern. Dies ist eine Schwachstelle an sich - jemand, der Ihren Webserver übernimmt, kann Ihr Datenbankschema ändern.

Ich empfehle Ihnen, die Datenbank zu erstellen und Migrationen in einem kleinen Dienstprogramm auszuführen, das Sie selbst ausführen, nicht als Teil Ihrer Webanwendung.

    
zmbq 30.04.2016 18:38
quelle
0

Ich denke, der Vorschlag von zmbq ist korrekt und es gibt eine Möglichkeit sicherzustellen, dass Migrationen zusammen mit der Bereitstellung ausgeführt werden, sodass Binärdateien und Datenbankänderungen mit der Veröffentlichungsfunktion von Visual Studio synchronisiert werden.

Beim Veröffentlichen mit einer IIS-Instanz kann die Verbindungszeichenfolge der Zieldatenbank angegeben werden, die auch für die Ausführung der erforderlichen Migrationen verwendet werden soll:

Dadurch wird sichergestellt, dass Änderungen nur bei Bedarf angewendet werden (nicht bei jedem Start der Anwendung) und dass die Anwendung mit den am wenigsten erforderlichen Datenbankrechten (dh Datenbankschreiber, Reader usw.) ausgeführt wird, anstatt Tabellen zu ändern, Indizes zu erstellen usw .

    
Alexei 24.05.2017 10:58
quelle