Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här självstudieserien visar hur du distribuerar (publicerar) en ASP.NET webbapp till Azure App Service Web Apps eller till en tredjepartsvärdleverantör med hjälp av Visual Studio 2012 eller Visual Studio 2010. Information om serien finns i den första självstudien i serien.
Översikt
Den här handledningen visar hur du förbereder projektet för databasdistribution. Databasstrukturen och vissa datamängder (inte alla) i applikationens två databaser måste distribueras till test-, staging- och produktionsmiljöer.
När du utvecklar ett program anger du vanligtvis testdata i en databas som du inte vill distribuera till en livewebbplats. Men du kan också ha vissa produktionsdata som du vill distribuera. I den här självstudien konfigurerar du Contoso University-projektet och förbereder SQL-skript så att rätt data inkluderas när du distribuerar.
Påminnelse: Om du får ett felmeddelande eller om något inte fungerar under genomgången av självstudien, bör du kontrollera felsökningssidan.
SQL Server Express LocalDB
Exempelprogrammet använder SQL Server Express LocalDB. SQL Server Express är den kostnadsfria versionen av SQL Server. Den används ofta under utveckling eftersom den baseras på samma databasmotor som fullständiga versioner av SQL Server. Du kan testa med SQL Server Express och vara säker på att programmet fungerar likadant i produktion, med några undantag för funktioner som varierar mellan SQL Server-utgåvor.
LocalDB är ett särskilt körningsläge för SQL Server Express som gör att du kan arbeta med databaser som .mdf filer. Vanligtvis lagras LocalDB-databasfiler i mappen App_Data för ett webbprojekt. Med funktionen för användarinstanser i SQL Server Express kan du också arbeta med .mdf filer, men funktionen för användarinstans är inaktuell. Därför rekommenderas LocalDB för att arbeta med .mdf filer.
Vanligtvis används inte SQL Server Express för webbprogram för produktion. I synnerhet LocalDB rekommenderas inte för produktionsanvändning med ett webbprogram eftersom det inte är utformat för att fungera med IIS.
I Visual Studio 2012 installeras LocalDB som standard med Visual Studio. I Visual Studio 2010 och tidigare versioner installeras SQL Server Express (utan LocalDB) som standard med Visual Studio. Det är därför du har installerat den som en av förhandskraven i den första självstudien i den här serien.
Mer information om SQL Server-utgåvor, inklusive LocalDB, finns i följande resurser arbeta med SQL Server-databaser.
Entity Framework och Universal Providers
För databasåtkomst kräver Contoso University-programmet följande programvara som måste distribueras med programmet eftersom den inte ingår i .NET Framework:
- ASP.NET Universal Providers (gör det möjligt för ASP.NET-medlemskapssystemet att använda Azure SQL Database)
- Entity Framework
Eftersom den här programvaran ingår i NuGet-paket är projektet redan konfigurerat så att de nödvändiga sammansättningarna distribueras med projektet. (Länkarna pekar på de aktuella versionerna av dessa paket, som kan vara nyare än vad som är installerat i startprojektet som du laddade ned för den här självstudien.)
Om du distribuerar till en tredjepartsleverantör för värdtjänster istället för Azure, kontrollera att du använder Entity Framework 5.0 eller senare. Tidigare versioner av Code First Migrations kräver fullständigt förtroende, och de flesta värdleverantörer kör ditt program i Medium Trust. Mer information om Medium Trust finns i handledningen Distribuera till IIS som en testmiljö.
Konfigurera Code First Migrations för distribution av programdatabaser
Contoso University-programdatabasen hanteras av Code First och du distribuerar den med hjälp av Code First Migrations. En översikt över databasdistributionen med hjälp av Code First Migrations finns i den första självstudien i den här serien.
När du distribuerar en programdatabas distribuerar du vanligtvis inte bara utvecklingsdatabasen med alla data i den till produktion, eftersom mycket av data i den förmodligen bara finns där i testsyfte. Till exempel är elevnamnen i en testdatabas fiktiva. Å andra sidan kan du ofta inte bara distribuera databasstrukturen utan några data alls. Vissa data i testdatabasen kan vara verkliga data och måste finnas där när användarna börjar använda programmet. Din databas kan till exempel ha en tabell som innehåller giltiga betygsvärden eller riktiga avdelningsnamn.
Om du vill simulera det här vanliga scenariot konfigurerar du en code first migrations-metod Seed som endast infogar de data som du vill ska finnas där i produktionen i databasen. Den här Seed metoden bör inte infoga testdata eftersom den körs i produktion när Code First har skapat databasen i produktion.
I tidigare versioner av Code First innan migreringar släpptes var det vanligt att metoder infogade Seed testdata också, eftersom databasen måste tas bort helt och hållet och återskapas från grunden vid varje modelländring under utvecklingen. Med Code First Migrations behålls testdata efter databasändringar, så det är inte nödvändigt att inkludera testdata i Seed metoden. Det projekt som du laddade ned använder metoden för att inkludera alla data i Seed metoden för en initialiserarklass. I den här handledningen inaktiverar du den initialiserarklassen och aktiverar migreringar. Sedan uppdaterar Seed du metoden i konfigurationsklassen Migreringar så att den endast infogar data som du vill infoga i produktion.
Följande diagram illustrerar schemat för programdatabasen:
För de här självstudierna antar du att tabellerna Student och Enrollment bör vara tomma när webbplatsen först distribueras. De andra tabellerna innehåller data som måste förinläsas när programmet går live.
Inaktivera initieraren
Eftersom du kommer att använda Code First Migrations behöver du inte använda DropCreateDatabaseIfModelChanges code first-initieraren. Koden för den här initieraren finns i filen SchoolInitializer.cs i contosoUniversity.DAL-projektet. En inställning i elementet appSettings i Web.config-filen gör att initieraren körs när programmet försöker komma åt databasen för första gången:
<appSettings>
<add key="Environment" value="Dev" />
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>
Öppna programmet Web.config fil och ta bort eller kommentera ut elementet add som anger klassen Code First initializer. Elementet appSettings ser nu ut så här:
<appSettings>
<add key="Environment" value="Dev" />
</appSettings>
Anmärkning
Ett annat sätt att ange en initialiserarklass är att göra det genom att anropa Database.SetInitializer metoden Application_Start i filen Global.asax . Om du aktiverar migreringar i ett projekt som använder den metoden för att ange initiatorn tar du bort den kodraden.
Anmärkning
Om du använder Visual Studio 2013 lägger du till följande steg mellan steg 2 och 3: (a) I PMC anger du "update-package entityframework -version 6.1.1" för att hämta den aktuella versionen av EF. Sedan (b) skapa projektet för att hämta en lista över byggfel och åtgärda dem. Ta bort med hjälp av instruktioner för namnområden som inte längre finns, högerklicka och klicka på Lös för att lägga till med hjälp av instruktioner där de behövs och ändra förekomster av System.Data.EntityState till System.Data.Entity.EntityState.
Aktivera code first migrations
Kontrollera att ContosoUniversity-projektet (inte ContosoUniversity.DAL) har angetts som startprojekt. Högerklicka på Projektet ContosoUniversity i Solution Explorer och välj Ange som startprojekt. Code First Migrations söker i startprojektet för att hitta databasanslutningssträngen.
På menyn Verktyg väljer du NuGet Package Manager>Manager-konsol.
Längst upp i fönstret Package Manager Console väljer du ContosoUniversity.DAL som standardprojekt och anger sedan "enable-migrations" i prompten
PM>.
(Om du får ett felmeddelande om att kommandot enable-migrations inte känns igen anger du kommandot update-package EntityFramework -Reinstall och försöker igen.)
Det här kommandot skapar en migreringsmapp i ContosoUniversity.DAL-projektet och placerar två filer i mappen: en Configuration.cs fil som du kan använda för att konfigurera migreringar och en InitialCreate.cs fil för den första migreringen som skapar databasen.
Du valde DAL-projektet i listrutan Standardprojekt i Package Manager-konsolen eftersom
enable-migrationskommandot måste köras i projektet som innehåller kontextklassen Code First. När klassen finns i ett klassbiblioteksprojekt letar Code First Migrations efter databasanslutningssträngen i startprojektet för lösningen. I ContosoUniversity-lösningen har webbprojektet angetts som startprojekt. Om du inte vill ange det projekt som har anslutningssträngen som startprojekt i Visual Studio kan du ange startprojektet i PowerShell-kommandot. Om du vill se kommandosyntaxen anger du kommandotget-help enable-migrations.Kommandot
enable-migrationsskapade automatiskt den första migreringen eftersom databasen redan finns. Ett alternativ är att låta migreringar skapa databasen. Det gör du genom att använda Server Explorer eller SQL Server Object Explorer för att ta bort ContosoUniversity-databasen innan du aktiverar migreringar. När du har aktiverat migreringar skapar du den första migreringen manuellt genom att ange kommandot "add-migration InitialCreate". Du kan sedan skapa databasen genom att ange kommandot "update-database".
Konfigurera Seed-metoden
I den här självstudien lägger du till fasta data genom att lägga till kod i Seed metoden för klassen Code First Migrations Configuration . Code First Migrations anropar Seed metoden efter varje migrering.
Seed Eftersom metoden körs efter varje migrering finns det redan data i tabellerna efter den första migreringen. För att hantera den här situationen använder AddOrUpdate du metoden för att uppdatera rader som redan har infogats eller infoga dem om de inte finns ännu. Metoden AddOrUpdate kanske inte är det bästa valet för ditt scenario. Mer information finns i Ta hand om EF 4.3 AddOrUpdate-metoden på Julie Lermans blogg.
Öppna filen Configuration.cs och ersätt kommentarerna i
Seedmetoden med följande kod:var instructors = new List<Instructor> { new Instructor { FirstMidName = "Kim", LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } }, new Instructor { FirstMidName = "Fadi", LastName = "Fakhouri", HireDate = DateTime.Parse("2002-07-06"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } }, new Instructor { FirstMidName = "Roger", LastName = "Harui", HireDate = DateTime.Parse("1998-07-01"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } }, new Instructor { FirstMidName = "Candace", LastName = "Kapoor", HireDate = DateTime.Parse("2001-01-15") }, new Instructor { FirstMidName = "Roger", LastName = "Zheng", HireDate = DateTime.Parse("2004-02-12") } }; instructors.ForEach(s => context.Instructors.AddOrUpdate(i => i.LastName, s)); context.SaveChanges(); var departments = new List<Department> { new Department { Name = "English", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 1 }, new Department { Name = "Mathematics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 2 }, new Department { Name = "Engineering", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 3 }, new Department { Name = "Economics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 4 } }; departments.ForEach(s => context.Departments.AddOrUpdate(d => d.Name, s)); context.SaveChanges(); var courses = new List<Course> { new Course { CourseID = 1050, Title = "Chemistry", Credits = 3, DepartmentID = 3 }, new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4 }, new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4 }, new Course { CourseID = 1045, Title = "Calculus", Credits = 4, DepartmentID = 2 }, new Course { CourseID = 3141, Title = "Trigonometry", Credits = 4, DepartmentID = 2 }, new Course { CourseID = 2021, Title = "Composition", Credits = 3, DepartmentID = 1 }, new Course { CourseID = 2042, Title = "Literature", Credits = 4, DepartmentID = 1 } }; courses.ForEach(s => context.Courses.AddOrUpdate(s)); context.SaveChanges(); courses[0].Instructors.Add(instructors[0]); courses[0].Instructors.Add(instructors[1]); courses[1].Instructors.Add(instructors[2]); courses[2].Instructors.Add(instructors[2]); courses[3].Instructors.Add(instructors[3]); courses[4].Instructors.Add(instructors[3]); courses[5].Instructors.Add(instructors[3]); courses[6].Instructors.Add(instructors[3]); context.SaveChanges();Referenserna till
Listhar röda vågiga linjer under sig eftersom du ännu inte har någonusingdeklaration för dess namnrymd. Högerklicka på någon av instanserna avListoch klicka på Lös och klicka sedan på System.Collections.Generic.
Den här menymarkeringen lägger till följande kod i
using-instruktionerna längst upp i filen.using System.Collections.Generic;Tryck på CTRL –SHIFT-B för att skapa projektet.
Projektet är nu redo att distribuera ContosoUniversity-databasen . När du har distribuerat programmet, första gången du kör det och navigerar till en sida som kommer åt databasen, skapar Code First databasen och kör den här Seed metoden.
Anmärkning
Att lägga till kod i Seed metoden är ett av många sätt att infoga fasta data i databasen. Ett alternativ är att lägga till kod i både Up- och Down-metoderna för varje migreringsklass. Metoderna Up och Down innehåller kod som implementerar databasändringar. Du kommer att se exempel på dem i handledningen Distribuera en databasuppdatering.
Du kan också skriva kod som kör SQL-instruktioner med hjälp Sql av metoden . Om du till exempel lägger till en budgetkolumn i tabellen Avdelning och vill initiera alla avdelningsbudgetar till 1 000,00 USD som en del av en migrering kan du lägga till följande kodrad i metoden för migreringen Up :
Sql("UPDATE Department SET Budget = 1000");
Skapa skript för distribution av medlemskapsdatabas
Contoso University-programmet använder ASP.NET medlemskapssystem och formulärautentisering för att autentisera och auktorisera användare. Sidan Uppdateringskrediter är endast tillgänglig för användare som har rollen Administratör.
Kör programmet och klicka på Kurser och klicka sedan på Uppdatera krediter.
Inloggningssidan visas eftersom sidan Uppdateringskrediter kräver administratörsbehörighet.
Ange administratör som användarnamn och devpwd som lösenord och klicka på Logga in.
Sidan Uppdateringskrediter visas.
Användar- och rollinformation finns i databasen aspnet-ContosoUniversity som anges av anslutningssträngen DefaultConnection i Web.config-filen .
Den här databasen hanteras inte av Entity Framework Code First, så du kan inte använda migreringar för att distribuera den. Du använder dbDacFx-providern för att distribuera databasschemat och konfigurerar publiceringsprofilen så att den kör ett skript som infogar inledande data i databastabeller.
Anmärkning
Ett nytt ASP.NET medlemskapssystem (nu med namnet ASP.NET Identity) introducerades med Visual Studio 2013. Med det nya systemet kan du behålla både program- och medlemskapstabeller i samma databas, och du kan använda Code First Migrations för att distribuera båda. Exempelprogrammet använder det tidigare ASP.NET medlemskapssystemet, som inte kan distribueras med hjälp av Code First Migrations. Procedurerna för att distribuera den här medlemskapsdatabasen gäller även för andra scenarion där ditt program behöver distribuera en SQL Server-databas som inte skapas av Entity Framework Code First.
Även här vill du vanligtvis inte ha samma data i produktion som du har under utveckling. När du distribuerar en webbplats för första gången är det vanligt att exkludera de flesta eller alla användarkonton som du skapar för testning. Därför har det nedladdade projektet två medlemskapsdatabaser: aspnet-ContosoUniversity.mdf med utvecklingsanvändare och aspnet-ContosoUniversity-Prod.mdf med produktionsanvändare. I denna handledning är användarnamnen samma i båda databaserna: admin och nonadmin. Båda användarna har lösenordet devpwd i utvecklingsdatabasen och prodpwd i produktionsdatabasen.
Du distribuerar utvecklingsanvändarna till testmiljön och produktionsanvändarna till staging och produktion. För att göra det skapar du två SQL-skript i den här självstudien, ett för utveckling och ett för produktion, och i senare självstudier konfigurerar du publiceringsprocessen för att köra dem.
Anmärkning
Medlemsdatabasen lagrar en hash med kontolösenord. För att kunna distribuera konton från en dator till en annan måste du se till att hash-rutiner inte genererar andra hashvärden på målservern än på källdatorn. De genererar samma hashvärden när du använder ASP.NET Universal Providers, så länge du inte ändrar standardalgoritmen. Standardalgoritmen är HMACSHA256 och anges i valideringsattributet för machineKey-elementet i Web.config-filen.
Du kan skapa datadistributionsskript manuellt, med hjälp av SQL Server Management Studio (SSMS) eller med hjälp av ett verktyg från tredje part. Resten av den här självstudien visar hur du gör det i SSMS, men om du inte vill installera och använda SSMS kan du hämta skripten från den färdiga versionen av projektet och gå vidare till avsnittet där du lagrar dem i lösningsmappen.
Installera SSMS genom att installera det från Download Center: Microsoft SQL Server 2012 Express genom att klicka på ENU\x64\SQLManagementStudio_x64_ENU.exe eller ENU\x86\SQLManagementStudio_x86_ENU.exe. Om du väljer fel för systemet kommer det inte att installeras och du kan prova den andra.
(Observera att det här är en nedladdning på 600 MB. Det kan ta lång tid att installera och kräver en omstart av datorn.)
På den första sidan i SQL Server Installation Center klickar du på Ny fristående SQL Server-installation eller lägger till funktioner i en befintlig installation och följer anvisningarna och godkänner standardalternativen.
Skapa skriptet för utvecklingsdatabasen
Kör SSMS.
I dialogrutan Anslut till server anger du (localdb)\v11.0 som servernamn, låter autentiseringen vara inställd på Windows-autentisering och klickar sedan på Anslut.
I fönstret Object Explorerexpanderar du Databaser, högerklickar på aspnet-ContosoUniversity, klickar på Uppgifter och klickar sedan på Generera skript.
I dialogrutan Generera och publicera skript klickar du på Ange skriptalternativ.
Du kan hoppa över steget Välj objekt eftersom standardvärdet är Skript hela databasen och alla databasobjekt och det är vad du vill.
Klicka på Avancerat.
I dialogrutan Avancerade skriptalternativ rullar du ned till Typer av data till skript och klickar på alternativet Endast data i listrutan.
Ändra Script USE DATABASE till False. USE-instruktioner är inte giltiga för Azure SQL Database och behövs inte för distribution till SQL Server Express i testmiljön.
Klicka på OK.
I dialogrutan Generera och publicera skript anger rutan Filnamn var skriptet ska skapas. Ändra sökvägen till din lösningsmapp (mappen som har din ContosoUniversity.sln-fil) och filnamnet till aspnet-data-dev.sql.
Klicka på Nästa för att gå till fliken Sammanfattning och klicka sedan på Nästa igen för att skapa skriptet.
Klicka på Finish.
Skapa produktionsdatabasskriptet
Eftersom du inte har kört projektet med produktionsdatabasen är det ännu inte kopplat till LocalDB-instansen. Därför måste du bifoga databasen först.
Högerklicka på Databaser i SSMS-objektutforskaren och klicka på Bifoga.
I dialogrutan Bifoga databaser klickar du på Lägg till och navigerar sedan till filen aspnet-ContosoUniversity-Prod.mdf i mappen App_Data .
Klicka på OK.
Följ samma procedur som du använde tidigare för att skapa ett skript för produktionsfilen. Ge skriptfilen namnet aspnet-data-prod.sql.
Sammanfattning
Båda databaserna är nu redo att distribueras och du har två datadistributionsskript i lösningsmappen.
I följande självstudie konfigurerar du projektinställningar som påverkar distributionen och konfigurerar automatiska Web.config filtransformeringar för inställningar som måste vara olika i det distribuerade programmet.
Mer information
Mer information om NuGet finns i Hantera projektbibliotek med NuGet och NuGet-dokumentation. Om du inte vill använda NuGet måste du lära dig hur du analyserar ett NuGet-paket för att avgöra vad det gör när det installeras. (Den kan till exempel konfigurera Web.config transformeringar, konfigurera PowerShell-skript så att de körs vid byggtid osv.) Mer information om hur NuGet fungerar finns i Skapa och publicera ett paket och konfigurationsfil och källkodstransformeringar.