| 

.NET C# Java Javascript Exception

2
Hallo

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.
News:
02.05.2014
GENiALi 2,5k 1 2 8
2 Antworten
1
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.

Wenn das auch nichts hilft, kann man mittlerweile auch Azure Websites remote debuggen. Siehe dazu den Remote Debugging a Window Azure Web Site with Visual Studio 2013
05.05.2014
Andreas Richter 1,7k 1 2 8
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.
GENiALi 06.05.2014
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")]

Wer weiss. Go to start.
GENiALi 06.05.2014
1
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.
Andreas Richter 06.05.2014
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. :-)
GENiALi 16.05.2014
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.
GENiALi 02.06.2014
1
Mir fallen da zwei Möglichkeiten ein.

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.

Database.SetInitializer<DeinContext>(new MigrateDatabaseToLatestVersion<DeinContext, DeineCodeFirstKonfiguration>());
02.05.2014
Andreas Richter 1,7k 1 2 8
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.
GENiALi 05.05.2014
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.
GENiALi 05.05.2014

Stelle deine .net-Frage jetzt!