Zelfstudie: EF-migraties gebruiken in een ASP.NET MVC-app en implementeren in Azure
Tot nu toe is de voorbeeldwebtoepassing van Contoso University lokaal uitgevoerd in IIS Express op uw ontwikkelcomputer. Als u een echte toepassing beschikbaar wilt maken voor andere personen die via internet kunnen worden gebruikt, moet u deze implementeren naar een webhostingprovider. In deze zelfstudie schakelt u Code First-migraties in en implementeert u de toepassing in de cloud in Azure:
- Schakel Code First Migrations in. Met de functie Migraties kunt u het gegevensmodel wijzigen en uw wijzigingen in productie implementeren door het databaseschema bij te werken zonder dat u de database hoeft te verwijderen en opnieuw te maken.
- Implementeren in Azure. Deze stap is optioneel; u kunt doorgaan met de resterende zelfstudies zonder het project te hebben geïmplementeerd.
Het is raadzaam om een proces voor continue integratie met broncodebeheer te gebruiken voor implementatie, maar in deze zelfstudie worden deze onderwerpen niet behandeld. Zie de Een cloudeigen .NET-microservice automatisch implementeren met GitHub Actions en Azure Pipelinesvoor meer informatie.
In deze zelfstudie gaat u het volgende doen:
- Code First-migraties inschakelen
- De app implementeren in Azure (optioneel)
Voorwaarden
Code First-migraties inschakelen
Wanneer u een nieuwe toepassing ontwikkelt, verandert uw gegevensmodel regelmatig en telkens wanneer het model wordt gewijzigd, wordt deze niet meer gesynchroniseerd met de database. U hebt het Entity Framework zo geconfigureerd dat de database automatisch wordt verwijderd en opnieuw wordt gemaakt telkens wanneer u het gegevensmodel wijzigt. Wanneer u entiteitsklassen toevoegt, verwijdert of wijzigt of uw DbContext
-klasse wijzigt, wordt de volgende keer dat u de toepassing uitvoert de bestaande database automatisch verwijderd, wordt er een nieuwe gemaakt die overeenkomt met het model en wordt deze gezaaid met testgegevens.
Deze methode om de database gesynchroniseerd te houden met het gegevensmodel werkt goed totdat u de toepassing in productie implementeert. Wanneer de toepassing wordt uitgevoerd in productie, worden meestal gegevens opgeslagen die u wilt behouden en wilt u niet alles verliezen telkens wanneer u een wijziging aanbrengt, zoals het toevoegen van een nieuwe kolom. Met de functie Code First Migrations wordt dit probleem opgelost door Code First in te schakelen om het databaseschema bij te werken in plaats van de database te verwijderen en opnieuw te maken. In deze zelfstudie implementeert u de toepassing en om u daarop voor te bereiden, schakelt u Migraties in.
Schakel de initialisatiefunctie uit die u eerder hebt ingesteld door het
contexts
element dat u aan het Web.config-bestand hebt toegevoegd, uit te schakelen of te verwijderen.<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>
Wijzig ook in het toepassingsbestand Web.config de naam van de database in de verbindingsreeks naar ContosoUniversity2.
<connectionStrings> <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> </connectionStrings>
Met deze wijziging wordt het project zo ingesteld dat de eerste migratie een nieuwe database maakt. Dit is niet vereist, maar u ziet later waarom het een goed idee is.
Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.
Voer bij de
PM>
prompt de volgende opdrachten in:enable-migrations add-migration InitialCreate
Met de opdracht
enable-migrations
maakt u een map Migrations in het Project ContosoUniversity en wordt in die map een Configuration.cs bestand geplaatst dat u kunt bewerken om Migraties te configureren.(Als u de bovenstaande stap hebt gemist waarmee u de naam van de database kunt wijzigen, vindt Migrations de bestaande database en voert u automatisch de opdracht
add-migration
uit. Dat is geen probleem. Dit betekent alleen dat u geen test van de migratiecode uitvoert voordat u de database implementeert. Later wanneer u de opdrachtupdate-database
uitvoert, gebeurt er niets omdat de database al bestaat.)Open het bestand ContosoUniversity\Migrations\Configuration.cs. Net als de initialisatieklasse die u eerder hebt gezien, bevat de
Configuration
klasse eenSeed
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" } // ); // } }
Het doel van de methode Seed is om u in staat te stellen testgegevens in te voegen of bij te werken nadat Code First de database heeft gemaakt of bijgewerkt. De methode wordt aangeroepen wanneer de database wordt gemaakt en telkens wanneer het databaseschema wordt bijgewerkt nadat een gegevensmodel is gewijzigd.
Instellen van de Seed-methode
Wanneer u de database opnieuw neerzet en aanmaakt voor elke wijziging in het datamodel, gebruikt u de methode Seed
van de initializerklasse om testgegevens in te voegen, omdat de database na elke wijziging in het model wordt verwijderd en alle testgegevens verloren gaan. Met Code First Migrations worden testgegevens bewaard nadat de database is gewijzigd, dus inclusief testgegevens in de methode Seed is doorgaans niet nodig. In feite wilt u niet dat de Seed
methode testgegevens invoegt als u Migraties gebruikt om de database in productie te implementeren, omdat de Seed
methode in productie wordt uitgevoerd. In dat geval wilt u dat de Seed
-methode alleen de gegevens invoegt in de database die u in productie nodig hebt. U wilt bijvoorbeeld dat de database werkelijke afdelingsnamen in de Department
tabel opneemt wanneer de toepassing beschikbaar is in productie.
Voor deze zelfstudie gebruikt u Migraties voor implementatie, maar uw Seed
methode voegt toch testgegevens in om te zien hoe de toepassingsfunctionaliteit werkt zonder dat u handmatig veel gegevens hoeft in te voegen.
Vervang de inhoud van het Configuration.cs-bestand door de volgende code, waarmee testgegevens in de nieuwe database worden geladen.
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(); } } }
De methode Seed gebruikt het databasecontextobject als invoerparameter en de code in de methode gebruikt dat object om nieuwe entiteiten aan de database toe te voegen. Voor elk entiteitstype maakt de code een verzameling nieuwe entiteiten, voegt deze toe aan de juiste DbSet-eigenschap en slaat de wijzigingen vervolgens op in de database. Het is niet nodig om de methode SaveChanges aan te roepen na elke groep entiteiten, zoals hier wordt gedaan, maar dit helpt u bij het vinden van de oorzaak van een probleem als er een uitzondering optreedt terwijl de code naar de database schrijft.
Sommige instructies die gegevens invoegen, gebruiken de AddOrUpdate methode om een upsert-bewerking uit te voeren. Omdat de methode
Seed
wordt uitgevoerd telkens wanneer u de opdrachtupdate-database
uitvoert, meestal na elke migratie, kunt u niet alleen gegevens invoegen, omdat de rijen die u probeert toe te voegen, zich al bevinden na de eerste migratie waarmee de database wordt gemaakt. De 'upsert'-bewerking voorkomt fouten die optreden als u een rij probeert in te voegen die al bestaat, maar deze overschrijft wijzigingen in gegevens die u mogelijk hebt aangebracht tijdens het testen van de toepassing. Met testgegevens in sommige tabellen wilt u dat mogelijk niet doen: in sommige gevallen wanneer u gegevens wijzigt tijdens het testen, wilt u dat uw wijzigingen na database-updates blijven. In dat geval wilt u een voorwaardelijke invoegbewerking uitvoeren: voeg alleen een rij in als deze nog niet bestaat. De Seed-methode maakt gebruik van beide benaderingen.De eerste parameter die is doorgegeven aan de AddOrUpdate methode geeft de eigenschap op die moet worden gebruikt om te controleren of er al een rij bestaat. Voor de door u opgegeven studentgegevens van de test kan de eigenschap
LastName
voor dit doel worden gebruikt, omdat elke achternaam in de lijst uniek is:context.Students.AddOrUpdate(p => p.LastName, s)
In deze code wordt ervan uitgegaan dat achternamen uniek zijn. Als u handmatig een leerling/student met een dubbele achternaam toevoegt, krijgt u de volgende uitzondering wanneer u de volgende keer een migratie uitvoert:
reeks bevat meer dan één element
Zie Seeding and Debugging Entity Framework (EF) databases op de blog van Rick Anderson voor informatie over het afhandelen van redundante gegevens, zoals twee studenten met de naam 'Alexander Carson'. Voor meer informatie over de methode
AddOrUpdate
, zie Wees voorzichtig met EF 4.3 AddOrUpdate Method op Julie Lermans blog.Bij de code die
Enrollment
entiteiten maakt, wordt ervan uitgegaan dat u deID
waarde in de entiteiten in de verzamelingstudents
hebt, hoewel u die eigenschap niet hebt ingesteld in de code waarmee de verzameling wordt gemaakt.new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, Grade = Grade.A },
U kunt de eigenschap
ID
hier gebruiken omdat deID
waarde is ingesteld wanneer uSaveChanges
aanroept voor destudents
verzameling. EF haalt automatisch de primaire-sleutelwaarde op wanneer er een entiteit in de database wordt ingevoegd en de eigenschapID
van de entiteit in het geheugen wordt bijgewerkt.De code waarmee elke
Enrollment
entiteit wordt toegevoegd aan deEnrollments
entiteitsset, maakt geen gebruik van deAddOrUpdate
methode. Er wordt gecontroleerd of er al een entiteit bestaat en wordt de entiteit ingevoegd als deze niet bestaat. Deze aanpak zorgt ervoor dat de wijzigingen die u aanbrengt in een inschrijvingscijfer behouden blijven door gebruik te maken van de gebruikersinterface van de applicatie. De code doorloopt elk lid van deEnrollment
List en als de inschrijving niet in de database wordt gevonden, wordt de inschrijving toegevoegd aan de database. De eerste keer dat u de database bijwerkt, is de database leeg, zodat elke inschrijving wordt toegevoegd.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); } }
Bouw het project.
De eerste migratie uitvoeren
Toen u de opdracht add-migration
uitvoerde, heeft Migrations de code gegenereerd waarmee de database helemaal opnieuw zou worden gemaakt. Deze code bevindt zich ook in de map Migrations, in het bestand met de naam <tijdstempel>_InitialCreate.cs. Met de Up
methode van de InitialCreate
-klasse worden de databasetabellen gemaakt die overeenkomen met de gegevensmodelentiteitssets en worden deze door de Down
methode verwijderd.
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");
}
}
Met migraties wordt de Up
methode aangeroepen om de wijzigingen in het gegevensmodel voor een migratie te implementeren. Wanneer u een opdracht invoert om de update terug te draaien, roept Migrations de methode Down
aan.
Dit is de eerste migratie die is gemaakt toen u de opdracht add-migration InitialCreate
hebt ingevoerd. De parameter (InitialCreate
in het voorbeeld) wordt gebruikt voor de bestandsnaam en kan zijn wat u wilt; doorgaans kiest u een woord of woordgroep die een overzicht geeft van wat er in de migratie wordt gedaan. U kunt bijvoorbeeld een latere migratie 'AddDepartmentTable' noemen.
Als u de eerste migratie hebt gemaakt wanneer de database al bestaat, wordt de code voor het maken van de database gegenereerd, maar hoeft deze niet te worden uitgevoerd omdat de database al overeenkomt met het gegevensmodel. Wanneer u de app implementeert in een andere omgeving waar de database nog niet bestaat, wordt deze code uitgevoerd om uw database te maken, dus het is een goed idee om deze eerst te testen. Daarom hebt u de naam van de database in de verbindingsreeks eerder gewijzigd, zodat migraties een geheel nieuwe database kunnen maken.
Voer in het venster Package Manager Console de volgende opdracht in:
update-database
Met de opdracht
update-database
wordt deUp
methode uitgevoerd om de database te maken. Vervolgens wordt de methodeSeed
uitgevoerd om de database te vullen. Hetzelfde proces wordt automatisch uitgevoerd in productie nadat u de toepassing hebt geïmplementeerd, zoals u in de volgende sectie ziet.Gebruik Server Explorer om de database te controleren zoals u in de eerste zelfstudie hebt gedaan en voer de toepassing uit om te controleren of alles nog steeds hetzelfde werkt als voorheen.
Implementeren in Azure
Tot nu toe is de toepassing lokaal uitgevoerd in IIS Express op uw ontwikkelcomputer. Om het beschikbaar te maken voor andere mensen om via internet te gebruiken, moet u het plaatsen bij een webhostingprovider. In deze sectie van de zelfstudie implementeert u deze in Azure. Deze sectie is optioneel; u kunt dit overslaan en doorgaan met de volgende zelfstudie, of u kunt de instructies in deze sectie aanpassen voor een andere hostingprovider van uw keuze.
Code First-migraties gebruiken om de database te implementeren
Als u de database wilt implementeren, gebruikt u Code First Migrations. Wanneer u het publicatieprofiel maakt dat u gebruikt om instellingen voor implementatie vanuit Visual Studio te configureren, schakelt u een selectievakje in met het label Database bijwerken. Deze instelling zorgt ervoor dat het implementatieproces de toepassing Web.config-bestand automatisch configureert op de doelserver, zodat Code First de MigrateDatabaseToLatestVersion
initializer-klasse gebruikt.
Visual Studio doet niets met de database tijdens het implementatieproces terwijl het uw project naar de doelserver kopieert. Wanneer u de geïmplementeerde toepassing uitvoert en deze de database voor de eerste keer na de implementatie opent, controleert Code First of de database overeenkomt met het gegevensmodel. Als er sprake is van een onjuiste overeenkomst, maakt Code Eerst automatisch de database (als deze nog niet bestaat) of werkt het databaseschema bij naar de nieuwste versie (als er een database bestaat maar niet overeenkomt met het model). Als de toepassing een migratiemethode Seed
implementeert, wordt de methode uitgevoerd nadat de database is gemaakt of het schema wordt bijgewerkt.
Uw Migraties Seed
-methode voegt testgegevens in. Als u in een productieomgeving implementeert, moet u de methode Seed
wijzigen, zodat alleen gegevens worden ingevoegd die u in uw productiedatabase wilt invoegen. In uw huidige gegevensmodel wilt u bijvoorbeeld echte cursussen hebben, maar fictieve studenten in de ontwikkelingsdatabase. U kunt een Seed
methode schrijven voor het laden tijdens de ontwikkeling, en vervolgens de fictieve studenten uitcommentariëren voordat u naar productie gaat. U kunt ook een Seed
methode schrijven om alleen cursussen te laden en de fictieve studenten in de testdatabase handmatig in te voeren met behulp van de gebruikersinterface van de toepassing.
Een Azure-account ophalen
U hebt een Azure-account nodig. Als u nog geen abonnement hebt, maar wel een Visual Studio-abonnement hebt, kunt u uw abonnementsvoordelen activeren. Anders kunt u binnen een paar minuten een gratis proefaccount maken. Zie gratis proefversie van Azurevoor meer informatie.
Een website en een SQL-database maken in Azure
Uw web-app in Azure wordt uitgevoerd in een gedeelde hostingomgeving, wat betekent dat deze wordt uitgevoerd op virtuele machines (VM's) die worden gedeeld met andere Azure-clients. Een gedeelde hostingomgeving is een goedkope manier om aan de slag te gaan in de cloud. Als uw webverkeer later toeneemt, kan de toepassing worden geschaald om aan de behoefte te voldoen door op toegewezen VM's uit te voeren. Lees App Service-prijzenvoor meer informatie over prijsopties voor Azure App Service.
U implementeert de database in Azure SQL Database. SQL Database is een relationele databaseservice in de cloud die is gebouwd op SQL Server-technologieën. Hulpprogramma's en toepassingen die met SQL Server werken, werken ook met SQL Database.
Kies in de Azure Management PortalEen resource maken op het linkertabblad en kies vervolgens Alle weergeven in het deelvenster Nieuw (of blade) om alle beschikbare resources weer te geven. Kies Web App + SQL in de Web-sectie van het Everything-blad. Kies ten slotte Aanmaken.
Het formulier voor het maken van een nieuwe New Web App + SQL resource wordt geopend.
Voer een tekenreeks in het App-naam vak in om te gebruiken als de unieke URL voor uw applicatie. De volledige URL bestaat uit wat u hier invoert plus het standaarddomein van Azure App Services (.azurewebsites.net). Als de app-naam al wordt gebruikt, geeft de wizard een bericht met de rode De app-naam is niet beschikbaar melding. Als de app-naam beschikbaar is, ziet u een groen vinkje.
Kies in het vak Abonnement het Azure-abonnement waarin u de App Service- wilt opslaan.
Kies in het tekstvak Resourcegroep een Resourcegroep of maak een nieuwe. Met deze instelling geeft u op in welk datacenter uw website wordt uitgevoerd. Zie Resourcegroepenvoor meer informatie over resourcegroepen.
Maak een nieuw App Service-plan door te klikken op de sectie App Service, Nieuwemaken en App Service-plan in te vullen (kan dezelfde naam hebben als App Service), Locatieen prijscategorie (er is een gratis optie).
Klik op SQL Database-en kies vervolgens Een nieuwe database maken of selecteer een bestaande database.
Voer in het vak Naam een naam in voor de database.
Klik op het vak voor doelserver en selecteer vervolgens Een nieuwe server maken. Als u eerder een server hebt gemaakt, kunt u die server ook selecteren in de lijst met beschikbare servers.
Kies prijscategorie sectie, kies Gratis. Als er extra resources nodig zijn, kan de database op elk gewenst moment omhoog worden geschaald. Zie Prijzen van Azure SQL Databasevoor meer informatie over prijzen van Azure SQL.
Wijzig indeling zo nodig.
Voer een beheerder in gebruikersnaam van SQL-beheerder en sql-beheerderswachtwoord.
- Als u Nieuwe SQL Database-serverhebt geselecteerd, definieert u een nieuwe naam en wachtwoord die u later gebruikt wanneer u de database opent.
- Als u een server hebt geselecteerd die u eerder hebt gemaakt, voert u referenties voor die server in.
Telemetrieverzameling kan worden ingeschakeld voor App Service met behulp van Application Insights. Met weinig configuratie verzamelt Application Insights waardevolle gebeurtenis, uitzondering, afhankelijkheid, aanvraag- en traceringsgegevens. Zie Azure Monitor-voor meer informatie over Application Insights.
Klik onderaan op om te maken en aan te geven dat u klaar bent.
De beheerportal keert terug naar de dashboardpagina en het gebied Meldingen boven aan de pagina laat zien dat de site wordt gemaakt. Na een tijdje (meestal minder dan een minuut) ziet u een melding dat de implementatie is geslaagd. In de navigatiebalk aan de linkerkant wordt de nieuwe App Service weergegeven in de sectie App Services en wordt de nieuwe SQL-database weergegeven in de sectie SQL-databases.
De app implementeren in Azure
Klik in Visual Studio met de rechtermuisknop op het project in Solution Explorer- en selecteer Publish in het contextmenu.
Op de pagina Een publicatiedoel kiezen, selecteer App Service en kies vervolgens voor Bestaandeselecteren, en kies daarna Publiceren.
Als u uw Azure-abonnement nog niet eerder hebt toegevoegd in Visual Studio, voert u de stappen uit op het scherm. Met deze stappen kan Visual Studio verbinding maken met uw Azure-abonnement, zodat de lijst met App Services- uw website bevat.
Selecteer op de pagina App Service het - abonnement waaraan u de App Service hebt toegevoegd. Selecteer binnen Weergavede Resourcegroep. Vouw de resourcegroep uit waaraan u de App Service hebt toegevoegd en selecteer vervolgens de App Service. Kies OK- om de app te publiceren.
Het venster Uitvoer laat zien welke implementatieacties zijn uitgevoerd en rapporteert dat de implementatie is voltooid.
Bij een geslaagde implementatie wordt de standaardbrowser automatisch geopend met de URL van de geïmplementeerde website.
Uw app wordt nu uitgevoerd in de cloud.
Op dit moment is de SchoolContext--database gemaakt in de Azure SQL-database, omdat u Code First Migrations (wordt uitgevoerd op app-start) hebt geselecteerd. Het Web.config-bestand op de geïmplementeerde website is gewijzigd, zodat de MigrateDatabaseToLatestVersion initializer de eerste keer wordt uitgevoerd dat uw code gegevens leest of schrijft in de database (wat is gebeurd toen u het tabblad Studenten hebt geselecteerd):
Tijdens het implementatieproces is ook een nieuwe verbindingsreeks gemaakt (SchoolContext_DatabasePublish) voor Code First Migrations die moet worden gebruikt voor het bijwerken van het databaseschema en het seeden van de database.
U vindt de geïmplementeerde versie van het Web.config-bestand op uw eigen computer in ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. U kunt het geïmplementeerde Web.config-bestand zelf openen met behulp van FTP. Zie voor instructies ASP.NET webimplementatie met Visual Studio: Een code-update implementeren. Volg de instructies die beginnen met 'Als u een FTP-hulpprogramma wilt gebruiken, hebt u drie dingen nodig: de FTP-URL, de gebruikersnaam en het wachtwoord'.
Notitie
De web-app implementeert geen beveiliging, dus iedereen die de URL vindt, kan de gegevens wijzigen. Zie Een Beveiligde ASP.NET MVC-app implementeren met lidmaatschap, OAuth en SQL-database in Azurevoor instructies over het beveiligen van de website. U kunt voorkomen dat anderen de site gebruiken door de service te stoppen met behulp van de Azure Management Portal of Server Explorer in Visual Studio.
Geavanceerde migratiescenario's
Als u een database implementeert door migraties automatisch uit te voeren zoals wordt weergegeven in deze zelfstudie en u implementeert op een website die op meerdere servers wordt uitgevoerd, kunt u meerdere servers tegelijkertijd migraties laten uitvoeren. Migraties zijn atomisch, dus als twee servers dezelfde migratie proberen uit te voeren, slaagt de ene en de andere mislukt (ervan uitgaande dat de bewerkingen niet twee keer kunnen worden uitgevoerd). Als u deze problemen wilt voorkomen, kunt u migraties handmatig aanroepen en uw eigen code zo instellen dat deze slechts eenmaal plaatsvindt. Voor meer informatie, zie Uitvoeren en scriptgebruik van migraties vanuit code op Rowan Millers blog en Migrate.exe (voor het uitvoeren van migraties via de opdrachtregel).
Zie Screencast Seriesvoor meer informatie over andere migratiescenario's.
Specifieke migratie bijwerken
update-database -target MigrationName
Met de opdracht update-database -target MigrationName
wordt de doelmigratie uitgevoerd.
Migratiewijzigingen in database negeren
Add-migration MigrationName -ignoreChanges
ignoreChanges
maakt een lege migratie met het huidige model als momentopname.
Code First-initialisators
In het implementatiegedeelte zag u de MigrateDatabaseToLatestVersion-initializer gebruikt worden. Code First biedt ook andere initializers, waaronder CreateDatabaseIfNotExists (de standaardinstelling), DropCreateDatabaseIfModelChanges (die u eerder hebt gebruikt) en DropCreateDatabaseAlways. De DropCreateAlways
initialisatiefunctie kan handig zijn voor het instellen van voorwaarden voor eenheidstests. U kunt ook uw eigen initializers schrijven en u kunt een initialisatiefunctie expliciet aanroepen als u niet wilt wachten totdat de toepassing naar de database leest of schrijft.
Zie Understanding Database Initializers in Entity Framework Code First en hoofdstuk 6 van het boek Programming Entity Framework: Code First door Julie Lerman en Rowan Miller voor meer informatie over initialisatieprogramma's.
De code ophalen
het voltooide project downloaden
Aanvullende informatiebronnen
Koppelingen naar andere Entity Framework-resources vindt u in ASP.NET Data Access - Aanbevolen bronnen.
Volgende stappen
In deze zelfstudie gaat u het volgende doen:
- Ingeschakelde Code First-migraties
- De app geïmplementeerd in Azure (optioneel)
Ga naar het volgende artikel voor meer informatie over het maken van een complexer gegevensmodel voor een ASP.NET MVC-toepassing.