Ich habe hier ein EF 6 Projekt wo ich mit Code first arbeite. Lokal wird dabei die DB/Tabellen einfach erstellt, so wie erwartet.
Jetzt habe ich das Teil auf Azure hochgeladen. Die DB selber existiert dort schon. Connect String habe ich angepasst. Müsste nun auf Azure auch die Tabellen automatisch erstellt werden? Wenn nicht, wenn man also die Scripte lokal erstellen muss und dann von Hand auf dem Azure SQL Server ausführen muss, wie kommt man an die Scripte?
Sowas hier (Update-Database -Script -SourceMigration: $InitialDatabase) will bei mir nicht funktionieren. Läuft zwar durch, SQL Script hat aber keinen Content.
Ich habe mal in den ersten Teil des Tutorials reingeschaut. Da sind mir 2 Dinge aufgefallen:
1. In LearningContextMigrationConfiguration wird AutomaticMigrationsEnabled und AutomaticMigrationDataLossAllowed auf True gesetzt.
Beide Einstellungen halte ich für gefährlich. Die besagen, dass das EF unabhängig von Migrationen Änderungen an der Datenbank-Struktur vornimmt, damit Db und Models übereinstimmen. Was eigentlich ganz gut klingt, birgt die Gefahr, dass du deine Anwendung mal mit einem auskommentierten Property einer deiner Models startest und schwups, wird die Spalte und alle darin enthaltenen Daten gelöscht.
Hier erstelle ich lieber selber Migrationen, wenn ich weiß, dass sich was an der Struktur der Models dauerhaft geändert hat.
2. Database.SetInitializer(new MigrateDatabaseToLatestVersion<LearningContext, LearningContextMigrationConfiguration>()) wird im Constructor des DbContext gesetzt. Die Einstellung ist, so weit ich weiß, nur ein mal pro App-Start notwendig.
Zu Deinem Problem: Das EF fürht die Migrationen erst aus, wenn ein DbContext auch erstellt wird. Prüf mal deine Anwendung, dass sie zumindest eine Abfrage gegen die Db fährt, damit die Migrationen greifen können.
Punkt 1: Ist mir bewusst. Aber zum experimentieren ist gut. Punkt 2: OK. Müsste man wohl ändern. :-) Punkt Debugen: Die wollen mir hier die Ports nicht öffnen. Ich kann kein Remote Debuging machen. :-(
Ich habe jetzt mal das Datenbankschema von Hand erstellt. Tut noch immer nicht. Denke lansgam das Problem ist wo anders zu suchen. Ich erstelle die ganze Geschichte mal VIEL einfacher, so nach Schema X ohne grosses Brimborium.
Ich habe jetzt mal den Connect String von der Web.config im Visual Studio als Datenbankverbindung genutzt. Ich kann mir damit auf die Azure DB verbinden. Die scheint also IO zu sein.
Aber vielleicht liegt es ja schlicht nur an einer Library die Azure nicht mag. z.B. Ninject oder das Konstruckt hier. [assembly: WebActivator.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")]
Hast du den ConnectionString auch in der Adminoberfläche für die Website eingestellt? Dort gibt es per default einen Eintrag für DefaultConnection, wenn ich mich recht erinnere. Der überschreibt den ConnectionString aus der web.config.
Sobald ich den Debugzugang habe werde ich das noch genauer anschauen. Aktuell kann ich noch nicht sagen an was es liegt. Dann bekommst du, Andreas, auch die entsprechende Bewertung. :-)
Es war schlicht und ergreifend der ConnectionString in der Adminoberfläche. Wenn man den genauer anschaut wird man das hier finden. Password={Ihr_Kennwort_hier_eingeben}; Das tut natürlich nicht. Bestätigt überrigends endlich von der Möglichkeit zu debuggen. Danke also für den Hinweis.
1. Wenn du das Deployment per Hand aus dem VisualStudio oder über ein WebDeploy-Package ausführst, kannst du in den Deploy-Einstellungen festlegen, dass ausstehende Migrationen sofort nach dem Aktualisieren ausgeführt werden.
2. Unabhängig von der Deploy-Methode kannst du in deinen Quellen hinterlegen, dass beim ersten Aufruf des Datenbankkkontextes ausstehende Migrationen ausgeführt werden. Dazu musst du MigrateDatabaseToLoatestVersion registrieren.
Ich habe heute Morgen noch das hier gefunden. Beschreibt schön beide Wege. http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application
Allerdings wird die auf dem Azure noch immer nicht generiert. Was besonders mühsam ist: Ich bekomme nirgends aussagekräftige Fehlermeldungen. Auch in den Error die man runterladen kann steht nichts.
Vielleicht liegt es auch an diesem Tutorial. http://bitoftech.net/2013/11/25/building-database-model-entityframework-code-first/ Ich habe die ganze Geschichte mit diesem 12 Teiligen Tut umgesetzt.
Punkt 2: OK. Müsste man wohl ändern. :-)
Punkt Debugen: Die wollen mir hier die Ports nicht öffnen. Ich kann kein Remote Debuging machen. :-(
Ich habe jetzt mal das Datenbankschema von Hand erstellt. Tut noch immer nicht. Denke lansgam das Problem ist wo anders zu suchen. Ich erstelle die ganze Geschichte mal VIEL einfacher, so nach Schema X ohne grosses Brimborium.