ASP.NET nasazení webu pomocí sady Visual Studio: Příprava na nasazení databáze
V této sérii kurzů se dozvíte, jak pomocí sady Visual Studio 2012 nebo Visual Studio 2010 nasadit (publikovat) ASP.NET webovou aplikaci do Azure App Service Web Apps nebo u poskytovatele hostingu třetí strany. Informace o této sérii najdete v prvním kurzu této série.
Přehled
V tomto kurzu se dozvíte, jak připravit projekt k nasazení databáze. Struktura databáze a některá (ne všechna) data ve dvou databázích aplikace musí být nasazeny do testovacího, přípravného a produkčního prostředí.
Při vývoji aplikace obvykle zadáváte testovací data do databáze, kterou nechcete nasadit na živý web. Můžete ale mít také produkční data, která chcete nasadit. V tomto kurzu nakonfigurujete projekt Contoso University a připravíte skripty SQL tak, aby se při nasazení zahrnula správná data.
Připomenutí: Pokud se vám při procházení kurzu zobrazí chybová zpráva nebo něco nefunguje, nezapomeňte se podívat na stránku pro řešení potíží.
SQL Server Express LocalDB
Ukázková aplikace používá SQL Server Express LocalDB. SQL Server Express je bezplatná edice SQL Server. Během vývoje se běžně používá, protože je založen na stejném databázovém stroji jako plné verze SQL Server. Můžete testovat pomocí SQL Server Express a mít jistotu, že se aplikace bude chovat stejně v produkčním prostředí s několika výjimkami pro funkce, které se liší mezi SQL Server edicemi.
LocalDB je speciální režim spouštění SQL Server Express, který umožňuje pracovat s databázemi ve formátu souborů .mdf. Soubory databáze LocalDB se obvykle uchovávají ve složce App_Data webového projektu. Funkce instance uživatele v SQL Server Express také umožňuje pracovat se soubory .mdf, ale funkce instance uživatele je zastaralá. Proto se pro práci se soubory .mdf doporučuje LocalDB.
SQL Server Express se obvykle nepoužívá pro produkční webové aplikace. Zejména localDB se nedoporučuje pro produkční použití s webovou aplikací, protože není určená pro práci se službou IIS.
V sadě Visual Studio 2012 se LocalDB instaluje ve výchozím nastavení se sadou Visual Studio. V sadě Visual Studio 2010 a starších verzích se SQL Server Express (bez LocalDB) instaluje ve výchozím nastavení se sadou Visual Studio. Proto jste ji nainstalovali jako jeden z předpokladů v prvním kurzu této série.
Další informace o edicích SQL Server, včetně LocalDB, najdete v následujících zdrojích informací Práce s databázemi SQL Server.
Entity Framework a univerzální poskytovatelé
Pro přístup k databázi vyžaduje aplikace Contoso University následující software, který musí být nasazen s aplikací, protože není součástí rozhraní .NET Framework:
- ASP.NET Univerzální poskytovatelé (umožňuje systému členství ASP.NET používat službu Azure SQL Database)
- Entity Framework
Vzhledem k tomu, že tento software je součástí balíčků NuGet, je projekt již nastaven tak, aby požadovaná sestavení byla nasazena s projektem. (Odkazy ukazují na aktuální verze těchto balíčků, které můžou být novější než ty, které jsou nainstalované v počátečním projektu, který jste stáhli pro účely tohoto kurzu.)
Pokud nasazujete u poskytovatele hostingu třetí strany místo do Azure, ujistěte se, že používáte Entity Framework 5.0 nebo novější. Starší verze Migrace Code First vyžadují úplný vztah důvěryhodnosti a většina poskytovatelů hostingu bude vaši aplikaci spouštět ve střední důvěryhodnosti. Další informace o střední důvěryhodnosti najdete v kurzu Nasazení do služby IIS jako testovacího prostředí .
Konfigurace Migrace Code First pro nasazení databáze aplikací
Databázi aplikace Contoso University spravuje Code First a nasadíte ji pomocí Migrace Code First. Přehled nasazení databáze pomocí Migrace Code First najdete v prvním kurzu v této sérii.
Když nasadíte databázi aplikací, obvykle jednoduše nenasadíte vývojovou databázi se všemi daty, která obsahuje, do produkčního prostředí, protože většina dat v ní je pravděpodobně pouze pro účely testování. Například jména studentů v testovací databázi jsou fiktivní. Na druhou stranu často nemůžete nasadit jenom strukturu databáze, která neobsahuje žádná data. Některá data v testovací databázi můžou být skutečná a musí tam být, když uživatelé začnou aplikaci používat. Databáze může mít například tabulku, která obsahuje platné hodnoty známek nebo názvy skutečných oddělení.
Pro simulaci tohoto běžného scénáře nakonfigurujete metodu Migrace Code FirstSeed
, která do databáze vloží jenom data, která chcete mít v produkčním prostředí. Tato Seed
metoda by neměla vkládat testovací data, protože se spustí v produkčním prostředí poté, co Code First vytvoří databázi v produkčním prostředí.
V dřívějších verzích Code First před vydáním migrace bylo běžné Seed
, že metody vkládaly testovací data také, protože při každé změně modelu během vývoje bylo nutné databázi zcela odstranit a znovu vytvořit od nuly. U Migrace Code First se testovací data uchovávají po změnách databáze, takže zahrnutí testovacích dat do Seed
metody není nutné. Projekt, který jste stáhli, používá metodu zahrnutí všech dat do Seed
metody třídy inicializátoru. V tomto kurzu zakážete tuto třídu inicializátoru a povolíte migrace. Pak aktualizujete metodu Seed
ve třídě konfigurace Migrations tak, aby vkládal jenom data, která chcete vložit do produkčního prostředí.
Následující diagram znázorňuje schéma databáze aplikace:
V těchto kurzech budete předpokládat, že Student
při prvním nasazení webu by tabulky a Enrollment
měly být prázdné. Ostatní tabulky obsahují data, která se musí předem načíst při spuštění aplikace.
Zakázání inicializátoru
Vzhledem k tomu, že budete používat Migrace Code First, nemusíte používat DropCreateDatabaseIfModelChanges
inicializátor Code First. Kód tohoto inicializátoru je v souboru SchoolInitializer.cs v projektu ContosoUniversity.DAL. Nastavení v elementu appSettings
souboruWeb.config způsobí, že se tento inicializátor spustí při každém prvním pokusu aplikace o přístup k databázi:
<appSettings>
<add key="Environment" value="Dev" />
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>
Otevřete aplikaci Web.config souboru a odeberte nebo zakomentujte add
prvek, který určuje třídu inicializátoru Code First. Element appSettings
teď vypadá takto:
<appSettings>
<add key="Environment" value="Dev" />
</appSettings>
Poznámka
Dalším způsobem, jak určit třídu inicializátoru, je provést voláním Database.SetInitializer
metody v Application_Start
souboru Global.asax . Pokud povolujete migrace v projektu, který používá tuto metodu k určení inicializátoru, odeberte tento řádek kódu.
Poznámka
Pokud používáte Visual Studio 2013, přidejte mezi kroky 2 a 3 následující kroky: (a) V PMC zadejte "update-package entityframework -version 6.1.1", abyste získali aktuální verzi EF. Pak (b) sestavte projekt, abyste získali seznam chyb sestavení a opravili je. Odstraňte příkazy using pro obory názvů, které už neexistují, klikněte pravým tlačítkem a klikněte na Vyřešit a přidejte příkazy using tam, kde jsou potřeba, a změňte výskyty System.Data.EntityState na System.Data.EntityState.
Povolení Migrace Code First
Ujistěte se, že projekt ContosoUniversity (nikoli ContosoUniversity.DAL) je nastavený jako spouštěný projekt. V Průzkumník řešení klikněte pravým tlačítkem na projekt ContosoUniversity a vyberte Nastavit jako spouštěný projekt. Migrace Code First vyhledá ve spouštěcím projektu připojovací řetězec databáze.
V nabídce Nástroje zvolteKonzola Správce>balíčků NuGet.
V horní části okna konzoly Správce balíčků vyberte jako výchozí projekt ContosoUniversity.DAL a pak do příkazového
PM>
řádku zadejte enable-migrations.(Pokud se zobrazí chyba s informací, že příkaz enable-migrations není rozpoznán, zadejte příkaz update-package EntityFramework -Reinstall a zkuste to znovu.)
Tento příkaz vytvoří složku Migrations v projektu ContosoUniversity.DAL a vloží do této složky dva soubory: soubor Configuration.cs , který můžete použít ke konfiguraci migrací, a soubor InitialCreate.cs pro první migraci, která vytvoří databázi.
V rozevíracím seznamu Výchozí projektkonzoly Správce balíčků jste vybrali projekt DAL, protože
enable-migrations
příkaz musí být proveden v projektu, který obsahuje kontextovou třídu Code First. Pokud je tato třída v projektu knihovny tříd, Migrace Code First hledá připojovací řetězec databáze v projektu po spuštění pro řešení. V řešení ContosoUniversity je webový projekt nastavený jako spouštěný projekt. Pokud nechcete v sadě Visual Studio určit projekt, který má připojovací řetězec, jako spouštěný projekt, můžete ho zadat v příkazu PowerShellu. Syntaxi příkazu zobrazíte zadáním příkazuget-help enable-migrations
.Příkaz
enable-migrations
automaticky vytvořil první migraci, protože databáze již existuje. Alternativou je nechat migraci vytvořit databázi. Uděláte to tak, že před povolením migrací odstraníte databázi ContosoUniversity pomocí Průzkumníka serveru nebo SQL Server Průzkumník objektů. Po povolení migrací vytvořte první migraci ručně zadáním příkazu add-migration InitialCreate. Databázi pak můžete vytvořit zadáním příkazu update-database.
Nastavení metody Seed
Pro účely tohoto kurzu přidáte pevná data přidáním kódu do Seed
metody třídy Migrace Code FirstConfiguration
. Migrace Code First volá metodu Seed
po každé migraci.
Vzhledem k tomu, že se Seed
metoda spouští po každé migraci, jsou data v tabulkách již po první migraci. K řešení této situace použijete metodu AddOrUpdate
k aktualizaci řádků, které už byly vloženy, nebo je vložíte, pokud ještě neexistují. Metoda AddOrUpdate
nemusí být pro váš scénář tou nejlepší volbou. Další informace najdete v tématu Dejte pozor s EF 4.3 AddOrUpdate Metoda na blogu Julie Lerman.
Otevřete soubor Configuration.cs a nahraďte komentáře v
Seed
metodě následujícím kódem: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();
Odkazy mají
List
pod sebou červenouusing
vlnovku, protože ještě nemáte příkaz pro jejich obor názvů. Klikněte pravým tlačítkem na jednu z instancí nástrojeList
, klikněte na Resolve (Vyřešit) a potom klikněte na using System.Collections.Generic (Použít System.Collections.Generic).Tento výběr nabídky přidá do
using
příkazů v horní části souboru následující kód.using System.Collections.Generic;
Stisknutím kombinace kláves CTRL-SHIFT-B sestavte projekt.
Projekt je teď připravený k nasazení databáze ContosoUniversity . Jakmile aplikaci poprvé spustíte a přejdete na stránku, která přistupuje k databázi, Code First vytvoří databázi a spustí tuto Seed
metodu.
Poznámka
Přidání kódu do Seed
metody je jedním z mnoha způsobů, jak můžete vložit pevná data do databáze. Alternativou je přidání kódu do Up
metod a Down
každé třídy migrace. Metody Up
a Down
obsahují kód, který implementuje změny databáze. Jejich příklady najdete v kurzu Nasazení aktualizace databáze .
Můžete také napsat kód, který spouští příkazy SQL pomocí metody .Sql
Pokud jste například do tabulky Department (Oddělení) přidávali sloupec Budget (Rozpočet) a v rámci migrace chcete inicializovat rozpočty všech oddělení na 1 000,00 USD, můžete do Up
metody pro tuto migraci přidat následující řádek kódu:
Sql("UPDATE Department SET Budget = 1000");
Vytvoření skriptů pro nasazení databáze členství
Aplikace Contoso University používá k ověřování a autorizaci uživatelů systém členství ASP.NET a ověřování pomocí formulářů. Stránka Aktualizovat kredity je přístupná jenom uživatelům, kteří mají roli správce.
Spusťte aplikaci, klikněte na Kurzy a pak klikněte na Aktualizovat kredity.
Přihlašovací stránka se zobrazí, protože stránka Aktualizovat kredity vyžaduje oprávnění správce.
Jako uživatelské jméno zadejte admin , jako heslo devpwd a klikněte na Přihlásit se.
Zobrazí se stránka Aktualizovat kredity .
Informace o uživateli a roli jsou v databázi aspnet-ContosoUniversity , která je určená připojovacím řetězcem DefaultConnection v souboruWeb.config .
Tuto databázi nespravuje Entity Framework Code First, takže k jejímu nasazení nemůžete použít migrace. K nasazení schématu databáze použijete zprostředkovatele dbDacFx a nakonfigurujete profil publikování tak, aby spustil skript, který vloží počáteční data do databázových tabulek.
Poznámka
S Visual Studio 2013 byl zaveden nový systém členství ASP.NET (nyní s názvem ASP.NET Identity). Nový systém umožňuje uchovávat tabulky aplikací i členství ve stejné databázi a k nasazení obou aplikací můžete použít Migrace Code First. Ukázková aplikace používá starší systém členství ASP.NET, který nelze nasadit pomocí Migrace Code First. Postupy pro nasazení této členské databáze platí také pro jakýkoli jiný scénář, ve kterém vaše aplikace potřebuje nasadit SQL Server databázi, která není vytvořená pomocí Entity Framework Code First.
Ani zde obvykle nechcete mít v produkčním prostředí stejná data, která máte ve vývoji. Při prvním nasazení webu je běžné vyloučit většinu nebo všechny uživatelské účty, které vytvoříte pro testování. Stažený projekt proto má dvě databáze členství: aspnet-ContosoUniversity.mdf s vývojáři a aspnet-ContosoUniversity-Prod.mdf s produkčními uživateli. Pro účely tohoto kurzu jsou uživatelská jména v obou databázích stejná: admin i nonadmin. Oba uživatelé mají heslo devpwd ve vývojové databázi a prodpwd v produkční databázi.
Vývojáři nasadíte do testovacího prostředí a produkční uživatele do přípravného a produkčního prostředí. V tomto kurzu vytvoříte dva skripty SQL, jeden pro vývoj a druhý pro produkční prostředí a v dalších kurzech nakonfigurujete proces publikování tak, aby se spouštěly.
Poznámka
V databázi členství se ukládá hodnota hash hesel účtů. Abyste mohli nasazovat účty z jednoho počítače na jiný, musíte zajistit, aby rutiny hash negenerovaly jiné hodnoty hash na cílovém serveru než na zdrojovém počítači. Při použití ASP.NET Universal Providers budou generovat stejné hodnoty hash, pokud nezměníte výchozí algoritmus. Výchozí algoritmus je HMACSHA256 a je zadaný v ověřovacím atributu elementu machineKey v souboru Web.config.
Skripty pro nasazení dat můžete vytvořit ručně, pomocí SQL Server Management Studio (SSMS) nebo pomocí nástroje třetí strany. V tomto zbývajícím kurzu se dozvíte, jak to udělat v SSMS, ale pokud nechcete nainstalovat a používat SSMS, můžete získat skripty z dokončené verze projektu a přeskočit na část, kde je uložíte do složky řešení.
Pokud chcete nainstalovat SSMS, nainstalujte ji ze služby Stažení softwaru: Microsoft SQL Server 2012 Express kliknutím naENU\x64\SQLManagementStudio_x64_ENU.exe nebo ENU\x86\SQLManagementStudio_x86_ENU.exe. Pokud pro svůj systém zvolíte špatnou možnost, instalace se nezdaří a můžete zkusit tu druhou.
(Všimněte si, že se jedná o 600 megabajtů ke stažení. Instalace může trvat dlouhou dobu a bude vyžadovat restartování počítače.)
Na první stránce SQL Server Installation Center klikněte na Nová SQL Server samostatnou instalaci nebo přidejte funkce do existující instalace a postupujte podle pokynů a přijměte výchozí volby.
Vytvoření skriptu vývojové databáze
Spusťte SSMS.
V dialogovém okně Připojit k serveru jako název serveru zadejte (localdb)\v11.0, ověřování ponechte nastavené na Ověřování systému Windows a klikněte na Připojit.
V okně Průzkumník objektů rozbalte databáze, klikněte pravým tlačítkem na aspnet-ContosoUniversity, klikněte na Úlohy a pak klikněte na Generovat skripty.
V dialogovém okně Generovat a publikovat skripty klikněte na Nastavit možnosti skriptování.
Krok Zvolit objekty můžete přeskočit, protože výchozí hodnota je Celá databáze skriptu a všechny databázové objekty a to je to, co chcete.
Klikněte na tlačítko Upřesnit.
V dialogovém okně Upřesnit možnosti skriptování přejděte dolů na Typy dat pro skript a v rozevíracím seznamu klikněte na možnost Pouze data .
Změňte script USE DATABASE na False. Příkazy USE nejsou platné pro Azure SQL Database a nejsou potřeba k SQL Server Express nasazení v testovacím prostředí.
Klikněte na OK.
V dialogovém okně Generovat a publikovat skripty určuje pole Název souboru , kde se skript vytvoří. Změňte cestu ke složce řešení (složku obsahující váš soubor ContosoUniversity.sln) a název souboru na aspnet-data-dev.sql.
Kliknutím na Další přejděte na kartu Souhrn a dalším kliknutím na Další vytvořte skript.
Klikněte na Finish (Dokončit).
Vytvoření skriptu produkční databáze
Vzhledem k tomu, že jste projekt nespustili s produkční databází, ještě není připojený k instanci LocalDB. Proto musíte nejprve připojit databázi.
V Průzkumník objektů SSMS klikněte pravým tlačítkem na Databáze a pak klikněte na Připojit.
V dialogovém okně Připojit databáze klikněte na Přidat a pak přejděte do souboru aspnet-ContosoUniversity-Prod.mdf ve složce App_Data .
Klikněte na OK.
Použijte stejný postup, který jste použili dříve k vytvoření skriptu pro produkční soubor. Soubor skriptu pojmenujte aspnet-data-prod.sql.
Souhrn
Obě databáze jsou teď připravené k nasazení a ve složce řešení máte dva skripty nasazení dat.
V následujícím kurzu nakonfigurujete nastavení projektu, které ovlivňuje nasazení, a nastavíte automatické transformace Web.config souborů pro nastavení, která se musí v nasazené aplikaci lišit.
Další informace
Další informace o NuGetu najdete v tématech Správa knihoven projektů pomocí NuGetu a Dokumentace k NuGetu. Pokud nechcete používat NuGet, budete se muset naučit analyzovat balíček NuGet, abyste zjistili, co dělá při instalaci. (Může například nakonfigurovat transformaceWeb.config , nakonfigurovat skripty PowerShellu tak, aby se spouštěly v době sestavení atd.) Další informace o tom, jak NuGet funguje, najdete v tématu Vytvoření a publikování transformací balíčku a konfiguračního souboru a zdrojového kódu.