Lernprogramm: Verwenden von EF-Migrationen in einer ASP.NET MVC-App und Bereitstellen in Azure
Bisher wurde die Contoso University-Beispielwebanwendung lokal in IIS Express auf Ihrem Entwicklungscomputer ausgeführt. Um eine echte Anwendung für andere Personen über das Internet zur Verfügung zu stellen, müssen Sie sie für einen Webhostinganbieter bereitstellen. In diesem Lernprogramm aktivieren Sie Code First-Migrationen und stellen die Anwendung in Azure in der Cloud bereit:
- Aktivieren Sie Code First-Migrationen. Mit dem Migrationsfeature können Sie das Datenmodell ändern und Ihre Änderungen in der Produktion bereitstellen, indem Sie das Datenbankschema aktualisieren, ohne die Datenbank ablegen und erneut erstellen zu müssen.
- Bereitstellen in Azure Dieser Schritt ist optional; Sie können mit den verbleibenden Lernprogrammen fortfahren, ohne das Projekt bereitgestellt zu haben.
Es wird empfohlen, einen kontinuierlichen Integrationsprozess mit der Quellcodeverwaltung für die Bereitstellung zu verwenden. In diesem Lernprogramm werden diese Themen jedoch nicht behandelt. Weitere Informationen finden Sie in den Kapiteln zur Quellcodeverwaltung und kontinuierlichen Integration von Building Real-World Cloud Apps mit Azure.
In diesem Tutorial:
- Aktivieren der ersten Codemigrationen
- Bereitstellen der App in Azure (optional)
Voraussetzungen
Aktivieren der ersten Codemigrationen
Wenn Sie eine neue Anwendung entwickeln, ändert sich Ihr Datenmodell häufig. Jedes Mal, wenn das Datenmodell geändert wird, ist es nicht mehr synchron mit der Datenbank. Sie haben das Entity Framework so konfiguriert, dass die Datenbank bei jeder Änderung des Datenmodells automatisch abzulegen und neu erstellt wird. Wenn Sie Entitätsklassen hinzufügen, entfernen oder ändern oder Ihre DbContext
Klasse ändern, wird beim nächsten Ausführen der Anwendung, die die vorhandene Datenbank automatisch löscht, eine neue Datenbank erstellt, die dem Modell entspricht, und sie mit Testdaten versehen.
Diese Methode, bei der die Datenbank mit dem Datenmodell synchron gehalten wird, funktioniert so lange, bis Sie die Anwendung für die Produktion bereitstellen. Wenn die Anwendung in der Produktion ausgeführt wird, werden in der Regel Daten gespeichert, die Sie beibehalten möchten, und Sie möchten nicht jedes Mal alles verlieren, wenn Sie eine Änderung vornehmen, z. B. das Hinzufügen einer neuen Spalte. Das Code First-Migrationen-Feature löst dieses Problem, indem Code First das Datenbankschema aktualisieren kann, anstatt die Datenbank zu löschen und erneut zu erstellen. In diesem Lernprogramm stellen Sie die Anwendung bereit und bereiten sich darauf vor, dass Sie Migrationen aktivieren.
Deaktivieren Sie den Zuvor eingerichteten Initialisierer, indem Sie das
contexts
Element auskommentieren oder löschen, das Sie der Datei "Web.config" der Anwendung hinzugefügt haben.<entityFramework> <!--<contexts> <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity"> <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" /> </context> </contexts>--> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
Ändern Sie auch in der Datei "application Web.config" den Namen der Datenbank im Verbindungszeichenfolge in "ContosoUniversity2".
<connectionStrings> <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> </connectionStrings>
Durch diese Änderung wird das Projekt so eingerichtet, dass die erste Migration eine neue Datenbank erstellt. Dies ist nicht erforderlich, aber Sie werden später sehen, warum dies eine gute Idee ist.
Wählen Sie im Menü Tools die Option NuGet-Paket-Manager>Paket-Manager-Konsole aus.
Geben Sie an der
PM>
Eingabeaufforderung die folgenden Befehle ein:enable-migrations add-migration InitialCreate
Der
enable-migrations
Befehl erstellt einen Migrationsordner im ContosoUniversity-Projekt und fügt diesen Ordner in eine Configuration.cs Datei ein, die Sie bearbeiten können, um Migrationen zu konfigurieren.(Wenn Sie den obigen Schritt verpasst haben, in dem Sie aufgefordert werden, den Datenbanknamen zu ändern, finden Migrationen die vorhandene Datenbank und führen den Befehl automatisch aus
add-migration
. Das ist in Ordnung, es bedeutet nur, dass Sie keinen Test des Migrationscodes ausführen, bevor Sie die Datenbank bereitstellen. Wenn Sie denupdate-database
Befehl später ausführen, geschieht nichts, da die Datenbank bereits vorhanden ist.)Öffnen Sie die Datei "ContosoUniversity\Migrations\Configuration.cs ". Wie die zuvor gesehene Initialisierungsklasse enthält die
Configuration
Klasse eineSeed
Methode.internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(ContosoUniversity.DAL.SchoolContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // } }
Mit der Seed-Methode können Sie Testdaten einfügen oder aktualisieren, nachdem Code First die Datenbank erstellt oder aktualisiert hat. Die Methode wird aufgerufen, wenn die Datenbank erstellt wird und jedes Mal, wenn das Datenbankschema aktualisiert wird, nachdem ein Datenmodell geändert wurde.
Einrichten der Seed-Methode
Wenn Sie die Datenbank für jede Datenmodelländerung ablegen und erneut erstellen, verwenden Sie die Methode der Initialisiererklasse Seed
, um Testdaten einzufügen, da nach jeder Änderung des Modells die Datenbank gelöscht wird und alle Testdaten verloren gehen. Bei Code First-Migrationen werden Testdaten nach Datenbankänderungen aufbewahrt, sodass in der Regel keine Testdaten in der Seed-Methode erforderlich sind. Tatsächlich möchten Sie nicht, dass die Seed
Methode Testdaten einfügt, wenn Sie Migrationen verwenden, um die Datenbank in der Produktion bereitzustellen, da die Methode in der Seed
Produktion ausgeführt wird. In diesem Fall soll die Seed
Methode nur die Daten, die Sie in der Produktion benötigen, in die Datenbank einfügen. Beispielsweise möchten Sie, dass die Datenbank tatsächliche Abteilungsnamen in die Department
Tabelle aufnehmen soll, wenn die Anwendung in der Produktion verfügbar wird.
In diesem Lernprogramm verwenden Sie Migrationen für die Bereitstellung, aber Ihre Seed
Methode fügt trotzdem Testdaten ein, um die Funktionsweise der Anwendungsfunktionalität einfacher zu erkennen, ohne viele Daten manuell einfügen zu müssen.
Ersetzen Sie den Inhalt der Configuration.cs-Datei durch den folgenden Code, der Testdaten in die neue Datenbank lädt.
namespace ContosoUniversity.Migrations { using ContosoUniversity.Models; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(ContosoUniversity.DAL.SchoolContext context) { var students = new List<Student> { new Student { FirstMidName = "Carson", LastName = "Alexander", EnrollmentDate = DateTime.Parse("2010-09-01") }, new Student { FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse("2012-09-01") }, new Student { FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse("2013-09-01") }, new Student { FirstMidName = "Gytis", LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2012-09-01") }, new Student { FirstMidName = "Yan", LastName = "Li", EnrollmentDate = DateTime.Parse("2012-09-01") }, new Student { FirstMidName = "Peggy", LastName = "Justice", EnrollmentDate = DateTime.Parse("2011-09-01") }, new Student { FirstMidName = "Laura", LastName = "Norman", EnrollmentDate = DateTime.Parse("2013-09-01") }, new Student { FirstMidName = "Nino", LastName = "Olivetto", EnrollmentDate = DateTime.Parse("2005-08-11") } }; students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s)); context.SaveChanges(); var courses = new List<Course> { new Course {CourseID = 1050, Title = "Chemistry", Credits = 3, }, new Course {CourseID = 4022, Title = "Microeconomics", Credits = 3, }, new Course {CourseID = 4041, Title = "Macroeconomics", Credits = 3, }, new Course {CourseID = 1045, Title = "Calculus", Credits = 4, }, new Course {CourseID = 3141, Title = "Trigonometry", Credits = 4, }, new Course {CourseID = 2021, Title = "Composition", Credits = 3, }, new Course {CourseID = 2042, Title = "Literature", Credits = 4, } }; courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s)); context.SaveChanges(); var enrollments = new List<Enrollment> { new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, Grade = Grade.A }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID, Grade = Grade.C }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Composition" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Anand").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID }, new Enrollment { StudentID = students.Single(s => s.LastName == "Anand").ID, CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Barzdukas").ID, CourseID = courses.Single(c => c.Title == "Chemistry").CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Li").ID, CourseID = courses.Single(c => c.Title == "Composition").CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Justice").ID, CourseID = courses.Single(c => c.Title == "Literature").CourseID, Grade = Grade.B } }; foreach (Enrollment e in enrollments) { var enrollmentInDataBase = context.Enrollments.Where( s => s.Student.ID == e.StudentID && s.Course.CourseID == e.CourseID).SingleOrDefault(); if (enrollmentInDataBase == null) { context.Enrollments.Add(e); } } context.SaveChanges(); } } }
Die Seed-Methode verwendet das Datenbankkontextobjekt als Eingabeparameter, und der Code in der Methode verwendet dieses Objekt, um der Datenbank neue Entitäten hinzuzufügen. Für jeden Entitätstyp erstellt der Code eine Auflistung neuer Entitäten, fügt sie der entsprechenden DbSet-Eigenschaft hinzu und speichert dann die Änderungen in der Datenbank. Es ist nicht erforderlich, die SaveChanges-Methode nach jeder Gruppe von Entitäten aufzurufen, wie hier beschrieben. Dies hilft Ihnen jedoch, die Quelle eines Problems zu finden, wenn eine Ausnahme auftritt, während der Code in die Datenbank schreibt.
Einige der Anweisungen, die Daten einfügen, verwenden die AddOrUpdate-Methode , um einen "Upsert"-Vorgang auszuführen. Da die
Seed
Methode jedes Mal ausgeführt wird, wenn Sie den Befehl ausführen, in derupdate-database
Regel nach jeder Migration, können Sie nicht nur Daten einfügen, da die Zeilen, die Sie hinzufügen möchten, bereits nach der ersten Migration vorhanden sind, die die Datenbank erstellt. Der Vorgang "upsert" verhindert Fehler, die auftreten würden, wenn Sie versuchen, eine Zeile einzufügen, die bereits vorhanden ist, aber alle Änderungen an Daten außer Kraft setzt , die Sie möglicherweise beim Testen der Anwendung vorgenommen haben. Bei Testdaten in einigen Tabellen möchten Sie dies möglicherweise nicht: in einigen Fällen, wenn Sie Daten ändern, während Sie testen, dass Ihre Änderungen nach Datenbankaktualisierungen verbleiben sollen. In diesem Fall möchten Sie einen Vorgang zum bedingten Einfügen ausführen: Fügen Sie eine Zeile nur ein, wenn sie noch nicht vorhanden ist. Die Seed-Methode verwendet beide Ansätze.Der erste Parameter, der an die AddOrUpdate-Methode übergeben wird, gibt die Eigenschaft an, die verwendet werden soll, um zu überprüfen, ob bereits eine Zeile vorhanden ist. Für die von Ihnen bereitgestellten Testteilnehmerdaten kann die
LastName
Eigenschaft zu diesem Zweck verwendet werden, da jeder Nachname in der Liste eindeutig ist:context.Students.AddOrUpdate(p => p.LastName, s)
Dieser Code geht davon aus, dass Nachnamen eindeutig sind. Wenn Sie einen Kursteilnehmer manuell mit einem doppelten Nachnamen hinzufügen, erhalten Sie beim nächsten Ausführen einer Migration die folgende Ausnahme:
Sequenz enthält mehr als ein Element
Informationen zum Umgang mit redundanten Daten wie zwei Studenten namens "Alexander Carson" finden Sie im Blog von Rick Anderson unter Seeding and Debugging Entity Framework (EF) DBs . Weitere Informationen zur Methode finden Sie im Blog von
AddOrUpdate
Julie Lerman unter EF 4.3 AddOrUpdate-Methode.Der Code, der Entitäten erstellt
Enrollment
, geht davon aus, dass Sie denID
Wert in den Entitäten in derstudents
Auflistung haben, obwohl Sie diese Eigenschaft nicht im Code festgelegt haben, der die Auflistung erstellt.new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, Grade = Grade.A },
Sie können die
ID
Eigenschaft hier verwenden, da derID
Wert festgelegt wird, wenn Sie diestudents
Sammlung aufrufenSaveChanges
. EF ruft automatisch den Primärschlüsselwert ab, wenn er eine Entität in die Datenbank einfügt und dieID
Eigenschaft der Entität im Arbeitsspeicher aktualisiert.Der Code, der jede
Enrollment
Entität zumEnrollments
Entitätssatz hinzufügt, verwendet nicht dieAddOrUpdate
Methode. Es überprüft, ob eine Entität bereits vorhanden ist und fügt die Entität ein, wenn sie nicht vorhanden ist. Dieser Ansatz behält Änderungen bei, die Sie an einer Registrierungsnote vornehmen, mithilfe der Benutzeroberfläche der Anwendung. Der Code durchläuft jedes Mitglied derEnrollment
Liste , und wenn die Registrierung in der Datenbank nicht gefunden wird, wird die Registrierung der Datenbank hinzugefügt. Wenn Sie die Datenbank zum ersten Mal aktualisieren, ist die Datenbank leer, sodass jede Registrierung hinzugefügt wird.foreach (Enrollment e in enrollments) { var enrollmentInDataBase = context.Enrollments.Where( s => s.Student.ID == e.Student.ID && s.Course.CourseID == e.Course.CourseID).SingleOrDefault(); if (enrollmentInDataBase == null) { context.Enrollments.Add(e); } }
Erstellen Sie das Projekt.
Ausführen der ersten Migration
Wenn Sie den add-migration
Befehl ausgeführt haben, generierten Migrationen den Code, der die Datenbank von Grund auf neu erstellen würde. Dieser Code befindet sich auch im Ordner "Migrationen " in der Datei mit dem Namen <"Timestamp>_InitialCreate.cs". Die Up
Methode der InitialCreate
Klasse erstellt die Datenbanktabellen, die den Datenmodellentitätssätzen entsprechen, und die Down
Methode löscht sie.
public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Course",
c => new
{
CourseID = c.Int(nullable: false),
Title = c.String(),
Credits = c.Int(nullable: false),
})
.PrimaryKey(t => t.CourseID);
CreateTable(
"dbo.Enrollment",
c => new
{
EnrollmentID = c.Int(nullable: false, identity: true),
CourseID = c.Int(nullable: false),
StudentID = c.Int(nullable: false),
Grade = c.Int(),
})
.PrimaryKey(t => t.EnrollmentID)
.ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: true)
.ForeignKey("dbo.Student", t => t.StudentID, cascadeDelete: true)
.Index(t => t.CourseID)
.Index(t => t.StudentID);
CreateTable(
"dbo.Student",
c => new
{
ID = c.Int(nullable: false, identity: true),
LastName = c.String(),
FirstMidName = c.String(),
EnrollmentDate = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.ID);
}
public override void Down()
{
DropForeignKey("dbo.Enrollment", "StudentID", "dbo.Student");
DropForeignKey("dbo.Enrollment", "CourseID", "dbo.Course");
DropIndex("dbo.Enrollment", new[] { "StudentID" });
DropIndex("dbo.Enrollment", new[] { "CourseID" });
DropTable("dbo.Student");
DropTable("dbo.Enrollment");
DropTable("dbo.Course");
}
}
Die Migrationsfunktion ruft die Methode Up
auf, um die Datenmodelländerungen für eine Migration zu implementieren. Wenn Sie einen Befehl eingeben, um ein Rollback für das Update auszuführen, ruft die Migrationsfunktion die Methode Down
auf.
Dies ist die erste Migration, die beim Eingeben des add-migration InitialCreate
Befehls erstellt wurde. Der Parameter (InitialCreate
im Beispiel) wird für den Dateinamen verwendet und kann beliebig sein. Sie wählen in der Regel ein Wort oder einen Ausdruck aus, der zusammenfasst, was in der Migration geschieht. Sie können einer späteren Migration beispielsweise den Namen „AddDepartmentTable“ geben.
Wenn Sie die ursprüngliche Migration erstellt haben, als die Datenbank bereits vorhanden war, wird der Code für die Datenbankerstellung zwar generiert, allerdings muss er nicht ausgeführt werden, da die Datenbank bereits dem Datenmodell entspricht. Wenn Sie die App in einer anderen Umgebung bereitstellen, in der die Datenbank noch nicht vorhanden ist, wird dieser Code ausgeführt, um Ihre Datenbank zu erstellen. Daher sollte dieser zunächst getestet werden. Deshalb haben Sie den Namen der Datenbank in der Verbindungszeichenfolge früher geändert, sodass Migrationen von Grund auf neu erstellen können.
Geben Sie im Fenster Paket-Manager-Konsole den folgenden Befehl ein:
update-database
Der
update-database
Befehl führt dieUp
Methode aus, um die Datenbank zu erstellen, und anschließend wird dieSeed
Methode zum Auffüllen der Datenbank ausgeführt. Derselbe Prozess wird nach der Bereitstellung der Anwendung automatisch in der Produktion ausgeführt, wie im folgenden Abschnitt zu sehen ist.Verwenden Sie den Server-Explorer , um die Datenbank wie im ersten Lernprogramm zu überprüfen, und führen Sie die Anwendung aus, um zu überprüfen, ob alles wie zuvor funktioniert.
Bereitstellung in Azure
Bisher wurde die Anwendung lokal in IIS Express auf Ihrem Entwicklungscomputer ausgeführt. Um es anderen Personen zur Verfügung zu stellen, die über das Internet verwendet werden können, müssen Sie sie für einen Webhostinganbieter bereitstellen. In diesem Abschnitt des Lernprogramms stellen Sie es in Azure bereit. Dieser Abschnitt ist optional; Sie können dies überspringen und mit dem folgenden Lernprogramm fortfahren, oder Sie können die Anweisungen in diesem Abschnitt für einen anderen Hostinganbieter Ihrer Wahl anpassen.
Verwenden von Code First-Migrationen zum Bereitstellen der Datenbank
Um die Datenbank bereitzustellen, verwenden Sie Code First-Migrationen. Wenn Sie das Veröffentlichungsprofil erstellen, das Sie zum Konfigurieren von Einstellungen für die Bereitstellung aus Visual Studio verwenden, aktivieren Sie ein Kontrollkästchen mit der Bezeichnung "Datenbank aktualisieren". Diese Einstellung bewirkt, dass der Bereitstellungsprozess die Anwendungsweb.config-Datei auf dem Zielserver automatisch konfiguriert, sodass Code First die MigrateDatabaseToLatestVersion
Initialisiererklasse verwendet.
Visual Studio macht während des Bereitstellungsprozesses nichts mit der Datenbank, während das Projekt auf den Zielserver kopiert wird. Wenn Sie die bereitgestellte Anwendung ausführen und nach der Bereitstellung zum ersten Mal auf die Datenbank zugreifen, überprüft Code First, ob die Datenbank dem Datenmodell entspricht. Wenn ein Konflikt vorliegt, erstellt Code First automatisch die Datenbank (sofern sie noch nicht vorhanden ist) oder aktualisiert das Datenbankschema auf die neueste Version (wenn eine Datenbank vorhanden ist, aber nicht mit dem Modell übereinstimmt). Wenn die Anwendung eine Migrationsmethode Seed
implementiert, wird die Methode ausgeführt, nachdem die Datenbank erstellt wurde oder das Schema aktualisiert wird.
Ihre Migrationsmethode Seed
fügt Testdaten ein. Wenn Sie die Bereitstellung in einer Produktionsumgebung vorgenommen haben, müssen Sie die Seed
Methode so ändern, dass nur Daten eingefügt werden, die In ihre Produktionsdatenbank eingefügt werden sollen. In Ihrem aktuellen Datenmodell möchten Sie z. B. echte Kurse, aber fiktive Studenten in der Entwicklungsdatenbank verwenden. Sie können eine Seed
Methode schreiben, um sowohl in der Entwicklung zu laden, als auch die fiktiven Kursteilnehmer auszukommentieren, bevor Sie sie für die Produktion bereitstellen. Sie können auch eine Seed
Methode schreiben, um nur Kurse zu laden, und die fiktiven Kursteilnehmer manuell in die Testdatenbank eingeben, indem Sie die Benutzeroberfläche der Anwendung verwenden.
Eröffnen eines Azure-Kontos
Sie benötigen ein Azure-Konto. Wenn Sie noch kein Abonnement haben, aber über ein Visual Studio-Abonnement verfügen, können Sie Ihre Abonnementvorteile aktivieren. Andernfalls können Sie in nur wenigen Minuten ein kostenloses Testkonto erstellen. Ausführliche Informationen finden Sie unter Einen Monat kostenlos testen.
Erstellen einer Website und einer SQL-Datenbank in Azure
Ihre Web-App in Azure wird in einer freigegebenen Hostingumgebung ausgeführt, was bedeutet, dass sie auf virtuellen Computern (VMs) ausgeführt wird, die für andere Azure-Clients freigegeben sind. Eine freigegebene Hostingumgebung ist eine kostengünstige Möglichkeit, mit der Verwendung der Cloud zu beginnen. Später kann die Anwendung skaliert werden, sobald der Webdatenverkehr zunimmt, um die Anforderungen durch die Ausführung dedizierter virtueller Maschinen zu erfüllen. Weitere Informationen zu den Preisoptionen für Azure-App Service finden Sie unter App Service-Preise.
Sie stellen die Datenbank in der Azure SQL-Datenbank bereit. SQL-Datenbank ist ein cloudbasierter relationaler Datenbankdienst, der auf SQL Server-Technologien basiert. Tools und Anwendungen, die mit SQL Server arbeiten, funktionieren auch mit SQL-Datenbank.
Wählen Sie im Azure-Verwaltungsportal auf der linken Registerkarte "Ressource erstellen" und dann "Alle anzeigen" im Bereich "Neu" (oder "Blatt") aus, um alle verfügbaren Ressourcen anzuzeigen. Wählen Sie Web App + SQL im Webabschnitt des Blatts "Alles " aus. Wählen Sie schließlich "Erstellen" aus.
Das Formular zum Erstellen einer neuen New Web App + SQL-Ressource wird geöffnet.
Geben Sie eine Zeichenfolge in das Feld "App-Name " ein, die als eindeutige URL für Ihre Anwendung verwendet werden soll. Die vollständige URL besteht aus dem, was Sie hier eingeben, sowie der Standarddomäne von Azure-App Services (.azurewebsites.net). Wenn der App-Name bereits verwendet wurde, benachrichtigt der Assistent Sie mit einer roten Meldung. Der App-Name ist nicht verfügbar . Wenn der App-Name verfügbar ist, wird ein grünes Häkchen angezeigt.
Wählen Sie im Feld "Abonnement" das Azure-Abonnement aus, in dem sich der App-Dienst befinden soll.
Wählen Sie im Textfeld "Ressourcengruppe " eine Ressourcengruppe aus, oder erstellen Sie eine neue Gruppe. Diese Einstellung gibt an, in welchem Rechenzentrum Ihre Website ausgeführt wird. Weitere Informationen zu Ressourcengruppen finden Sie unter "Ressourcengruppen".
Erstellen Sie einen neuen App Service-Plan , indem Sie auf den Abschnitt "App Service" klicken, "Neu erstellen" und den App-Service-Plan ausfüllen (kann mit dem Namen "App Service", "Standort" und "Preisstufe" übereinstimmen (es gibt eine kostenlose Option).
Klicken Sie auf SQL-Datenbank, und wählen Sie dann "Neue Datenbank erstellen" aus, oder wählen Sie eine vorhandene Datenbank aus.
Geben Sie im Feld "Name " einen Namen für Die Datenbank ein.
Klicken Sie auf das Feld "Zielserver", und wählen Sie dann "Neuen Server erstellen" aus. Alternativ können Sie, wenn Sie zuvor einen Server erstellt haben, diesen Server aus der Liste der verfügbaren Server auswählen.
Wählen Sie den Abschnitt "Preisstufe" aus, und wählen Sie "Kostenlos" aus. Wenn zusätzliche Ressourcen benötigt werden, kann die Datenbank jederzeit skaliert werden. Weitere Informationen zu den Azure SQL-Preisen finden Sie unter Azure SQL-Datenbank Preise.
Ändern Sie die Sortierung nach Bedarf.
Geben Sie einen SQL-Administratorbenutzernamen und ein SQL-Administratorkennwort ein.
- Wenn Sie "Neuer SQL-Datenbank-Server" ausgewählt haben, definieren Sie einen neuen Namen und ein neues Kennwort, das Sie später verwenden werden, wenn Sie auf die Datenbank zugreifen.
- Wenn Sie einen Server ausgewählt haben, den Sie zuvor erstellt haben, geben Sie Anmeldeinformationen für diesen Server ein.
Telemetrieauflistung kann für App-Dienst mithilfe von Application Insights aktiviert werden. Mit geringer Konfiguration sammelt Application Insights wertvolle Ereignisse, Ausnahmen, Abhängigkeiten, Anforderungs- und Ablaufverfolgungsinformationen. Weitere Informationen zu Application Insights finden Sie unter Azure Monitor.
Klicken Sie unten auf "Erstellen ", um anzugeben, dass Sie fertig sind.
Das Verwaltungsportal kehrt zur Dashboardseite zurück, und der Bereich "Benachrichtigungen" oben auf der Seite zeigt, dass die Website erstellt wird. Nach einer Weile (in der Regel weniger als eine Minute) gibt es eine Benachrichtigung, dass die Bereitstellung erfolgreich war. In der Navigationsleiste links wird der neue App-Dienst im Abschnitt "App Services " angezeigt, und die neue SQL-Datenbank wird im Abschnitt "SQL-Datenbanken " angezeigt.
Bereitstellen der Anwendung in Azure
Klicken Sie im Projektmappen-Explorer von Visual Studio mit der rechten Maustaste auf das Projekt, und wählen Sie im Kontextmenü Veröffentlichen aus.
Wählen Sie auf der Seite "Ziel veröffentlichen " die Option "App Service " und dann " Vorhanden" und dann " Veröffentlichen" aus.
Wenn Sie Ihr Azure-Abonnement noch nicht in Visual Studio hinzugefügt haben, führen Sie die Schritte auf dem Bildschirm aus. Mit diesen Schritten kann Visual Studio eine Verbindung mit Ihrem Azure-Abonnement herstellen, sodass die Liste der App Services Ihre Website enthält.
Wählen Sie auf der Seite "App Service " das Abonnement aus, dem Sie den App-Dienst hinzugefügt haben. Wählen Sie unter "Ansicht" die Option "Ressourcengruppe" aus. Erweitern Sie die Ressourcengruppe, der Sie den App-Dienst hinzugefügt haben, und wählen Sie dann den App-Dienst aus. Wählen Sie "OK" aus, um die App zu veröffentlichen.
Im Fenster Ausgabe wird angezeigt, welche Bereitstellungsaktionen ausgeführt wurden, und es wird die erfolgreiche Durchführung der Bereitstellung gemeldet.
Bei erfolgreicher Bereitstellung wird der Standardbrowser automatisch mit der URL der bereitgestellten Website geöffnet.
Ihre App wird jetzt in der Cloud ausgeführt.
Zu diesem Zeitpunkt wurde die SchoolContext-Datenbank in der Azure SQL-Datenbank erstellt, da Sie "Ausführen Code First-Migrationen" ausgewählt haben (wird beim Starten der App ausgeführt). Die Datei "Web.config" auf der bereitgestellten Website wurde geändert, sodass der MigrateDatabaseToLatestVersion-Initializer beim ersten Lesen oder Schreiben von Daten in der Datenbank ausgeführt wird (dies geschieht, wenn Sie die Registerkarte "Kursteilnehmer " ausgewählt haben):
Der Bereitstellungsprozess hat auch eine neue Verbindungszeichenfolge (SchoolContext_DatabasePublish) für Code First-Migrationen zum Aktualisieren des Datenbankschemas und zum Seeding der Datenbank erstellt.
Sie finden die bereitgestellte Version der Datei "Web.config" auf Ihrem eigenen Computer in ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. Sie können über FTP auf die bereitgestellte Web.config-Datei selbst zugreifen. Anweisungen finden Sie unter ASP.NET Webbereitstellung mit Visual Studio: Bereitstellen eines Codeupdates. Befolgen Sie die Anweisungen, die mit "Um ein FTP-Tool zu verwenden, benötigen Sie drei Dinge: die FTP-URL, den Benutzernamen und das Kennwort".
Hinweis
Die Web-App implementiert keine Sicherheit, sodass jeder, der die URL findet, die Daten ändern kann. Anweisungen zum Sichern der Website finden Sie unter Bereitstellen einer sicheren ASP.NET MVC-App mit Mitgliedschaft, OAuth und SQL-Datenbank in Azure. Sie können verhindern, dass andere Personen die Website verwenden, indem Sie den Dienst mithilfe des Azure-Verwaltungsportals oder des Server-Explorers in Visual Studio beenden.
Erweiterte Migrationsszenarien
Wenn Sie eine Datenbank bereitstellen, indem Sie Migrationen automatisch ausführen, wie in diesem Lernprogramm gezeigt, und Sie auf einer Website bereitstellen, die auf mehreren Servern ausgeführt wird, können Sie mehrere Server abrufen, auf denen Migrationen gleichzeitig ausgeführt werden sollen. Migrationen sind atomar. Wenn also zwei Server versuchen, dieselbe Migration auszuführen, wird eine erfolgreich sein, und die andere schlägt fehl (vorausgesetzt, die Vorgänge können nicht zweimal ausgeführt werden). In diesem Szenario, wenn Sie diese Probleme vermeiden möchten, können Sie Migrationen manuell aufrufen und Ihren eigenen Code so einrichten, dass sie nur einmal auftritt. Weitere Informationen finden Sie unter Ausführen und Skriptingmigrationen aus Code im Blog von Rowan Miller und Migrate.exe (zum Ausführen von Migrationen über die Befehlszeile).
Informationen zu anderen Migrationsszenarien finden Sie unter "Migrations Screencast Series".
Aktualisieren bestimmter Migrationen
update-database -target MigrationName
Der update-database -target MigrationName
Befehl führt die gezielte Migration aus.
Migrationsänderungen an der Datenbank ignorieren
Add-migration MigrationName -ignoreChanges
ignoreChanges
erstellt eine leere Migration mit dem aktuellen Modell als Momentaufnahme.
Erste Codeinitialisierer
Im Bereitstellungsabschnitt haben Sie gesehen, dass der MigrateDatabaseToLatestVersion-Initializer verwendet wurde. Code First stellt auch andere Initialisierer bereit, einschließlich CreateDatabaseIfNotExists (Standard), DropCreateDatabaseIfModelChanges (die Sie zuvor verwendet haben) und DropCreateDatabaseAlways. Der DropCreateAlways
Initialisierer kann nützlich sein, um Bedingungen für Komponententests einzurichten. Sie können auch eigene Initialisierer schreiben und einen Initialisierer explizit aufrufen, wenn Sie nicht warten möchten, bis die Anwendung aus der Datenbank gelesen oder in die Datenbank schreibt.
Weitere Informationen zu Initialisierern finden Sie unter Understanding Database Initializers in Entity Framework Code First und Kapitel 6 des Buchs Programming Entity Framework: Code First by Julie Lerman und Rowan Miller.
Abrufen des Codes
Herunterladen des abgeschlossenen Projekts
Zusätzliche Ressourcen
Links zu anderen Entity Framework-Ressourcen finden Sie in ASP.NET Datenzugriff – Empfohlene Ressourcen.
Nächste Schritte
In diesem Tutorial haben Sie:
- Erste Migrationen mit aktivierter Code
- Bereitgestellte App in Azure (optional)
Wechseln Sie zum nächsten Artikel, um zu erfahren, wie Sie ein komplexeres Datenmodell für eine ASP.NET MVC-Anwendung erstellen.