Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V této sérii kurzů se dozvíte, jak nasadit (publikovat) webovou aplikaci ASP.NET do Azure App Service Web Apps nebo poskytovatele hostingu třetí strany pomocí sady Visual Studio 2012 nebo Visual Studio 2010. Informace o této sérii najdete v prvním kurzu série.
Přehled
V tomto kurzu se dozvíte, jak připravit projekt na nasazení databáze. Struktura databáze a některá (ne všechna) data ve dvou databázích aplikace se musí nasadit do testovacího, přípravného a produkčního prostředí.
Při vývoji aplikace obvykle zadáte testovací data do databáze, kterou nechcete nasadit na živý web. Můžete ale mít také nějaká produkční data, která chcete nasadit. V tomto kurzu nakonfigurujete projekt Contoso Pro vysokoškoláky a připravíte skripty SQL tak, aby se při nasazování zahrnula správná data.
Připomenutí: Pokud se 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 Serveru. Běžně se používá během vývoje, protože je založen na stejném databázovém stroji jako úplné verze SQL Serveru. S SQL ServerEm Express můžete testovat a být si jisti, že se aplikace bude chovat stejně v produkčním prostředí s několika výjimkami pro funkce, které se liší mezi edicemi SQL Serveru.
LocalDB je zvláštní režim spouštění SQL Serveru Express, který umožňuje pracovat s databázemi jako se soubory .mdf . Soubory databáze LocalDB se obvykle uchovávají ve složce App_Data webového projektu. Funkce instance uživatele v SQL Serveru Express také umožňuje pracovat s .mdf soubory, ale funkce instance uživatele je zastaralá. Proto se doporučuje pracovat s .mdf soubory LocalDB.
Sql Server Express se obvykle nepoužívá pro produkční webové aplikace. Místní databáze se nedoporučuje pro produkční použití s webovou aplikací, protože není navržená pro práci se službou IIS.
Ve Visual Studio 2012 je LocalDB nainstalováno ve výchozím nastavení s Visual Studiem. V sadě Visual Studio 2010 a starších verzích je SQL Server Express (bez localDB) ve výchozím nastavení nainstalován se sadou Visual Studio; proto jste ho nainstalovali jako jeden z požadavků v prvním kurzu této série.
Další informace o edicích SQL Serveru, včetně LocalDB, najdete v následujících zdrojích informací Práce s databázemi SQL Serveru.
Entity Framework a univerzální zprostředkovatelé
Pro přístup k databázi aplikace Contoso University vyžaduje následující software, který musí být nasazen s aplikací, protože není součástí rozhraní .NET Framework:
- ASP.NET Universal Providers (umožňuje systému ASP.NET členství používat Azure SQL Database)
- Entity Framework
Vzhledem k tomu, že tento software je součástí balíčků NuGet, projekt je již nastavený tak, aby se požadovaná sestavení nasadila s projektem. (Odkazy odkazují na aktuální verze těchto balíčků, které můžou být novější než to, co je nainstalované v úvodním projektu, který jste si stáhli pro účely tohoto kurzu.)
Pokud nasazujete na poskytovatele hostingu třetí strany místo Azure, ujistěte se, že používáte Entity Framework 5.0 nebo novější. Starší verze Code First Migrace vyžadují úplnou důvěryhodnost a většina poskytovatelů hostingu spustí vaši aplikaci ve střední úrovni důvěry. Další informace o Medium Trust najdete v kurzu Nasazení na IIS jako testovací prostředí.
Konfigurace migrací Code First pro nasazení aplikační databáze
Aplikační databáze Contoso University se spravuje pomocí code First a nasadíte ji pomocí migrace Code First. Přehled nasazení databáze pomocí migrací Code First najdete v prvním kurzu této série.
Když nasadíte aplikační databázi, obvykle jednoduše nenasazujete vývojovou databázi se všemi daty v ní 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 bez dat. Některá data v testovací databázi můžou být skutečná data 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 skutečné názvy oddělení.
Pro simulaci tohoto běžného scénáře nakonfigurujete metodu Migrace Seed Code First, která vloží do databáze pouze data, která tam 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 migrací bylo běžné, že metody Seed také vkládaly testovací data, protože při každé změně modelu během vývoje bylo nutné databázi zcela odstranit a kompletně vytvořit od začátku. Při migraci Code First se testovací data zachovají po změnách databáze, takže zahrnutí testovacích dat do Seed metody není nutné. Stažený projekt 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 pouze data, která chcete vložit do produkčního prostředí.
Následující diagram znázorňuje schéma aplikační databáze:
V těchto kurzech se předpokládá, že tabulky Student a Enrollment by měly být prázdné při prvním nasazení lokality. Ostatní tabulky obsahují data, která musí být předem načtena, když aplikace přejde do provozu.
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 pro tento inicializátor je v souboru SchoolInitializer.cs v projektu ContosoUniversity.DAL. Nastavení v appSettings elementu souboruWeb.config způsobí spuštění tohoto inicializátoru při 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 soubor Web.config a odeberte nebo okomentujte prvek add, který určuje třídu Code First initializer. Prvek 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 Application_Start v souboru Global.asax . Pokud povolíte migrace v projektu, který tuto metodu používá 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é již neexistují, klikněte pravým tlačítkem myši a klikněte na tlačítko Vyřešit, abyste přidali příkazy using tam, kde jsou potřeba, a změňte výskyty System.Data.EntityState na System.Data.Entity.EntityState.
Povolení Migrace Code First
Ujistěte se, že je projekt ContosoUniversity (ne ContosoUniversity.DAL) nastavený jako spouštěný projekt. V Průzkumníku řešení klikněte pravým tlačítkem na projekt ContosoUniversity a vyberte Nastavit jako spouštěný projekt. Migrace Code First se podívá do spouštěcího projektu a vyhledá připojovací řetězec databáze.
V nabídce Nástroje zvoltekonzolu Správce>balíčků NuGet.
V horní části okna konzoly Správce balíčků vyberte jako výchozí projekt ContosoUniversity.DAL a pak na příkazovém
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 InitialCreate.cs soubor pro první migraci, která vytvoří databázi.
V rozevíracím seznamu Výchozí projekt konzole Správce balíčků jste vybrali projekt DAL, protože příkaz
enable-migrationsmusí být proveden v projektu, který obsahuje třídu kontextu Code First. Pokud je tato třída v projektu knihovny tříd, migrace Code First vyhledá připojovací řetězec databáze v spouštěcím projektu pro řešení. V řešení ContosoUniversity byl webový projekt nastaven jako spouštěný projekt. Pokud nechcete určit projekt, který obsahuje připojovací řetězec, jako spouštěcí projekt v aplikaci Visual Studio, můžete spouštěcí projekt specifikovat v příkazu PowerShellu. Pokud chcete zobrazit syntaxi příkazu, zadejte příkazget-help enable-migrations.Příkaz
enable-migrationsautomaticky vytvořil první migraci, protože databáze již existuje. Alternativou je vytvořit databázi pomocí migrací. Uděláte to tak, že před povolením migrací odstraníte databázi ContosoUniversity pomocí Průzkumníka serveru nebo Průzkumníka objektů SQL Serveru . 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
V tomto kurzu přidáte pevná data přidáním kódu do Seed metody třídy Code First Migrations Configuration . Migrace Code First volá metodu Seed po každé migraci.
Vzhledem k tomu, že metoda Seed běží po každé migraci, jsou data již v tabulkách 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í. Tato AddOrUpdate metoda nemusí být pro váš scénář nejlepší volbou. Další informace naleznete v tématu Pozor na metodu AddOrUpdate v EF 4.3 na blogu Julie Lermanové.
Otevřete soubor Configuration.cs a nahraďte komentáře v
Seedmetodě 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 na
Listmají červené vlnovky pod sebou, protože ještě nemáte příkazusingpro jeho obor názvů. Klikněte pravým tlačítkem myši na jednu z instancíLista klepněte na tlačítko Vyřešit a potom klepněte na příkaz System.Collections.Generic.
Tato položka nabídky přidá následující kód do
usingvýrazů v horní části souboru.using System.Collections.Generic;Stisknutím kláves CTRL-SHIFT-B sestavte projekt.
Projekt je teď připravený k nasazení databáze ContosoUniversity . Po nasazení aplikace ji 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 do databáze vložit pevná data. Alternativou je přidání kódu do metod Up a Down každé migrační třídy. Tyto Up metody Down obsahují kód, který implementuje změny databáze. Příklady najdete v kurzu Nasazení aktualizace databáze .
Pomocí metody můžete také napsat kód, který spouští příkazy Sql SQL. Pokud jste například do tabulky Oddělení přidali sloupec Rozpočet a chtěli jste v rámci migrace inicializovat všechny rozpočty oddělení na 1 000,00 USD, můžete do Up metody této migrace přidat následující řádek kódu:
Sql("UPDATE Department SET Budget = 1000");
Vytváření skriptů pro nasazení databáze členství
Aplikace Contoso University používá k ověřování a autorizaci uživatelů systém ASP.NET členství a ověřování formulářů. Stránka Aktualizovat kredity je přístupná jenom uživatelům, kteří jsou v roli správce.
Spusťte aplikaci a klepněte na tlačítko Kurzy a potom klepněte na tlačítko Aktualizovat kredity.
Stránka Přihlášení se zobrazí, protože stránka Aktualizovat kredity vyžaduje oprávnění správce.
Jako uživatelské jméno zadejte správce a 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čena připojovacím řetězcem DefaultConnection v souboru Web.config .
Tuto databázi nespravuje Entity Framework Code First, takže k jejímu nasazení nemůžete použít migrace. Pomocí zprostředkovatele dbDacFx nasadíte schéma databáze a nakonfigurujete profil publikování tak, aby se spustil skript, který vloží počáteční data do databázových tabulek.
Poznámka:
V sadě Visual Studio 2013 byl zaveden nový systém členství ASP.NET (nyní s názvem ASP.NET Identity). Nový systém umožňuje zachovat 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ý nejde nasadit pomocí migrací Code First. Postupy nasazení této databáze členství platí také pro jakýkoli jiný scénář, ve kterém vaše aplikace potřebuje nasadit databázi SQL Serveru, která není vytvořená službou Entity Framework Code First.
Tady také obvykle nechcete mít stejná data v produkčním prostředí, která máte ve vývoji. Při prvním nasazení webu je běžné vyloučit většinu uživatelských účtů nebo všechny uživatelské účty, které vytvoříte pro testování. Stažený projekt má proto dvě databáze členství: aspnet-ContosoUniversity.mdf s vývojářskými uživateli a aspnet-ContosoUniversity-Prod.mdf s produkčními uživateli. V tomto kurzu jsou uživatelská jména stejná v obou databázích: admin i nonadmin. Oba uživatelé mají heslo devpwd ve vývojové databázi a prodpwd v produkční databázi.
Vývojové uživatele nasadíte do testovacího prostředí a produkčních uživatelů 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 je spouštěl.
Poznámka:
Databáze členství ukládá hodnotu hash hesel účtu. Aby bylo možné nasadit účty z jednoho počítače do druhého, je nutné zajistit, aby rutiny hash negenerovaly na cílovém serveru jiné hodnoty hash, než jsou na zdrojovém počítači. Při použití ASP.NET Univerzálních poskytovatelů se vygenerují stejné hodnoty hash, pokud výchozí algoritmus nezměníte. Výchozí algoritmus je HMACSHA256 a je určen v ověřovacím atributu prvku machineKey v souboru Web.config.
Skripty nasazení dat můžete vytvářet ručně pomocí aplikace SQL Server Management Studio (SSMS) nebo pomocí nástroje třetí strany. Ve zbývající části tohoto kurzu se dozvíte, jak to udělat v nástroji SSMS, ale pokud nechcete instalovat a používat SSMS, můžete získat skripty z dokončené verze projektu a přeskočit do části, do které je uložíte do složky řešení.
Chcete-li nainstalovat SSMS, nainstalujte ji z webu Download Center: Microsoft SQL Server 2012 Express kliknutím na enu\x64\SQLManagementStudio_x64_ENU.exe nebo ENU\x86\SQLManagementStudio_x86_ENU.exe. Pokud vyberete nesprávný prvek pro váš systém, nenainstaluje se a můžete zkusit druhý.
(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 centra instalace SYSTÉMU SQL Server klikněte na samostatnou instalaci nového SQL Serveru nebo přidejte funkce do existující instalace a postupujte podle pokynů a přijměte výchozí možnosti.
Vytvoření skriptu vývojové databáze
Spusťte SSMS.
V dialogovém okně Připojit k serveru zadejte (localdb)\v11.0 jako název serveru, ponechte ověřování nastaveno na Ověřování systému Windows a potom klepněte na tlačítko Připojit.
V okně Průzkumník objektů rozbalte položku Databáze, klepněte pravým tlačítkem myši aspnet-ContosoUniversity, klepněte na položku Úkoly a potom klepněte na příkaz Generovat skripty.
V dialogovém okně Generovat a publikovat skripty klepněte na tlačítko Nastavit možnosti skriptování.
Krok Zvolit objekty můžete přeskočit, protože výchozí hodnota je Skriptovat celou databázi 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í se posuňte dolů k typům dat do skriptu a v rozevíracím seznamu klikněte na možnost Pouze data .
Změňte skript USE DATABASE na False. Příkazy USE nejsou platné pro Azure SQL Database a nejsou potřeba pro nasazení do SQL Serveru Express v testovacím prostředí.
Klikněte na OK.
V dialogovém okně Generovat a publikovat skripty určuje pole Název souboru , kde bude skript vytvořen. Změňte cestu ke složce, ve které je umístěn váš soubor ContosoUniversity.sln, a název souboru na aspnet-data-dev.sql.
Kliknutím na tlačítko Další přejděte na kartu Souhrn a potom znovu klepněte na tlačítko Další a vytvořte skript.
Klikněte na Dokončit.
Vytvoření skriptu produkční databáze
Vzhledem k tomu, že jste projekt nespustili s produkční databází, není ještě připojena k instanci LocalDB. Proto musíte nejprve připojit databázi.
V Průzkumníku objektů SSMS klikněte pravým tlačítkem myši na Databáze a klikněte na Připojit.
V dialogovém okně Připojit databáze klepněte na tlačítko Přidat a přejděte do aspnet-ContosoUniversity-Prod.mdf souboru ve složce App_Data .
Klikněte na OK.
Postupujte podle stejného postupu, který jste použili dříve k vytvoření skriptu pro produkční soubor. Pojmenujte soubor skriptu aspnet-data-prod.sql.
Shrnutí
Obě databáze jsou teď připravené k nasazení a máte ve složce řešení dva skripty pro nasazení dat.
V následujícím kurzu nakonfigurujete nastavení projektu, které ovlivňují nasazení, a nastavíte automatické transformace souborůWeb.config pro nastavení, která se musí lišit v nasazené aplikaci.
Další informace
Další informace o NuGetu najdete v tématu Správa knihoven projektů pomocí NuGetu a dokumentace 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 Web.config transformace, nakonfigurovat skripty PowerShellu tak, aby běžely v době sestavení atd.) Další informace o tom, jak NuGet funguje, najdete v tématu Vytváření a publikování balíčků a konfiguračních souborů a transformací zdrojového kódu.