Sdílet prostřednictvím


Kurz: Použití migrací EF v aplikaci ASP.NET MVC a nasazení do Azure

Zatím byla ukázková webová aplikace Contoso University spuštěná místně ve službě IIS Express ve vašem vývojovém počítači. Pokud chcete zpřístupnit skutečnou aplikaci pro ostatní lidi, kteří můžou používat přes internet, musíte ji nasadit na poskytovatele webového hostingu. V tomto kurzu povolíte migrace Code First a nasadíte aplikaci do cloudu v Azure:

  • Povolte Migrace Code First. Funkce Migrace umožňuje změnit datový model a nasadit změny do produkčního prostředí aktualizací schématu databáze, aniž byste museli databázi vyřadit a znovu vytvořit.
  • Nasazení do Azure Tento krok je nepovinný; můžete pokračovat ve zbývajících kurzech, aniž byste projekt nasadili.

Doporučujeme použít proces kontinuální integrace se správou zdrojového kódu pro nasazení, ale tento kurz se těmito tématy nezabývá. Další informace najdete v tématu Automatické nasazení cloud-native mikroslužby pomocí GitHub Actions a Azure Pipelines.

V tomto kurzu se naučíte:

  • Povolení migrací Code First
  • Nasazení aplikace v Azure (volitelné)

Požadavky

Povolení migrací Code First

Při vývoji nové aplikace se datový model často mění a pokaždé, když se model změní, přestane se synchronizovat s databází. Nakonfigurovali jste Entity Framework tak, aby automaticky zahodila a znovu vytvořila databázi při každé změně datového modelu. Když přidáte, odeberete nebo změníte třídy entit nebo změníte DbContext třídu, při příštím spuštění aplikace automaticky odstraní existující databázi, vytvoří novou, která odpovídá modelu, a vytvoří ji s testovacími daty.

Tato metoda synchronizace databáze s datovým modelem funguje dobře, dokud aplikaci nenasadíte do produkčního prostředí. Když aplikace běží v produkčním prostředí, obvykle ukládá data, která chcete zachovat, a nechcete ztratit všechno při každé změně, například přidání nového sloupce. Funkce Migrace Code First tento problém řeší povolením code First aktualizovat schéma databáze místo vyřazení a opětovného vytvoření databáze. V tomto kurzu nasadíte aplikaci a připravíte se na to, abyste povolili migrace.

  1. Zakažte inicializátor, který jste nastavili dříve, tím, že zakomentujete nebo odstraníte contexts prvek, který jste přidali do souboru Web.config aplikace.

    <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>
    
  2. Také v souboru Web.config aplikace změňte název databáze v připojovací řetězec na ContosoUniversity2.

    <connectionStrings>
      <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    Tato změna nastaví projekt tak, aby první migrace vytvořila novou databázi. To není povinné, ale později uvidíte, proč je to dobrý nápad.

  3. V nabídce Nástroje vyberte Správce balíčků> NuGet Správce balíčků Konzola.

  4. Na příkazovém PM> řádku zadejte následující příkazy:

    enable-migrations
    add-migration InitialCreate
    

    Příkaz enable-migrations vytvoří složku Migrations v projektu ContosoUniversity a vloží do ní soubor Configuration.cs , který můžete upravit a nakonfigurovat migrace.

    (Pokud jste vynechali výše uvedený krok, který vás nasměruje na změnu názvu databáze, migrace najdou existující databázi a automaticky provede add-migration příkaz. To znamená, že před nasazením databáze nespustíte test kódu migrace. Později při spuštění update-database příkazu se nic nestane, protože databáze již existuje.)

    Otevřete soubor ContosoUniversity\Migrations\Configuration.cs. Stejně jako inicializační třída, kterou jste viděli dříve, Configuration třída obsahuje metodu Seed .

    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" }
            //    );
            //
        }
    }
    

    Účelem metody Seed je umožnit vložení nebo aktualizaci testovacích dat po vytvoření nebo aktualizaci databáze Code First. Metoda se volá při vytvoření databáze a při každé aktualizaci schématu databáze po změně datového modelu.

Nastavení metody Seed

Když odstraníte a znovu vytvoříte databázi pro každou změnu datového modelu, použijete metodu třídy inicializátoru Seed k vložení testovacích dat, protože po každé změně modelu se databáze zahodí a všechna testovací data budou ztracena. Při Migrace Code First se testovací data uchovávají po změnách databáze, takže zahrnutí testovacích dat do metody Seed obvykle není nutné. Ve skutečnosti nechcete Seed , aby metoda vkládala testovací data, pokud k nasazení databáze do produkčního prostředí použijete migrace, protože Seed metoda se spustí v produkčním prostředí. V takovém případě chcete Seed , aby metoda vložil do databáze pouze data, která potřebujete v produkčním prostředí. Můžete například chtít, aby databáze obsahovala do tabulky skutečné názvy Department oddělení, jakmile bude aplikace dostupná v produkčním prostředí.

V tomto kurzu budete používat migrace pro nasazení, ale vaše Seed metoda přesto vloží testovací data, aby bylo snazší zjistit, jak funkce aplikace fungují, aniž byste museli ručně vkládat velké množství dat.

  1. Obsah souboru Configuration.cs nahraďte následujícím kódem, který načte testovací data do nové databáze.

    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();
            }
        }
    }
    

    Seed metoda přebírá objekt kontextu databáze jako vstupní parametr a kód v metodě používá tento objekt k přidání nových entit do databáze. Pro každý typ entity kód vytvoří kolekci nových entit, přidá je do příslušné vlastnosti DbSet a pak uloží změny do databáze. Není nutné zavolat metodu SaveChanges po každé skupině entit, jak je zde provedeno, ale to vám pomůže najít zdroj problému, pokud dojde k výjimce, když kód zapisuje do databáze.

    Některé příkazy, které vkládají data, používají AddOrUpdate metodu k provedení operace upsert. Vzhledem k tomu, že se Seed metoda spustí pokaždé, když spustíte update-database příkaz, obvykle po každé migraci, nemůžete jenom vložit data, protože řádky, které se pokoušíte přidat, už tam budou po první migraci, která vytvoří databázi. Operace upsert zabraňuje chybám, ke kterým by došlo, pokud se pokusíte vložit řádek, který již existuje, ale přepíše všechny změny dat, které jste mohli provést při testování aplikace. U testovacích dat v některých tabulkách možná nebudete chtít, aby k tomu došlo: v některých případech při změně dat při testování chcete, aby změny zůstaly po aktualizacích databáze. V takovém případě chcete provést operaci podmíněného vložení: vložte řádek jenom v případě, že ještě neexistuje. Metoda Seed používá oba přístupy.

    První parametr předaný metodě AddOrUpdate určuje vlastnost, která se má použít ke kontrole, zda řádek již existuje. Pro údaje o testech studentů, které poskytujete, lze vlastnost použít k tomuto účelu, LastName protože každé příjmení v seznamu je jedinečné:

    context.Students.AddOrUpdate(p => p.LastName, s)
    

    Tento kód předpokládá, že příjmení jsou jedinečná. Pokud ručně přidáte studenta s duplicitním příjmením, při příští migraci se zobrazí následující výjimka:

    Sekvence obsahuje více než jeden prvek.

    Informace o tom, jak zpracovávat redundantní data, jako jsou dva studenti s názvem "Alexander Carson", naleznete v tématu Seeding a Ladění Databází Entity Framework (EF) na blogu Rick Andersona. Další informace o AddOrUpdate metodě naleznete v tématu Péče o EF 4.3 AddOrUpdate Metoda na Blogu Julie Lermana.

    Kód, který vytváří Enrollment entity, předpokládá, že máte ID hodnotu v entitách v students kolekci, i když jste tuto vlastnost nenastavili v kódu, který vytvoří kolekci.

    new Enrollment { 
        StudentID = students.Single(s => s.LastName == "Alexander").ID, 
        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, 
        Grade = Grade.A 
    },
    

    Tuto vlastnost můžete použít ID , protože ID hodnota je nastavena při volání SaveChanges kolekce students . EF automaticky získá hodnotu primárního klíče, když vloží entitu do databáze a aktualizuje ID vlastnost entity v paměti.

    Kód, který přidá každou Enrollment entitu Enrollments do sady entit, nepoužívá metodu AddOrUpdate . Zkontroluje, jestli už entita existuje, a pokud entitu neexistuje, vloží ji. Tento přístup zachová změny, které provedete ve známce registrace pomocí uživatelského rozhraní aplikace. Kód prochází každý člen Enrollmentseznamu a pokud se registrace v databázi nenajde, přidá ji do databáze. Při první aktualizaci databáze bude databáze prázdná, takže přidá každou registraci.

    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);
        }
    }
    
  2. Sestavte projekt.

Provedení první migrace

Při spuštění add-migration příkazu vygenerovaly migrace kód, který by vytvořil databázi od nuly. Tento kód je také ve složce Migrations v souboru s názvem <timestamp>_InitialCreate.cs. Up Metoda InitialCreate třídy vytvoří databázové tabulky, které odpovídají sadám entit datového modelu, a Down metoda je odstraní.

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");
    }
}

Migrace volá metodu Up pro implementaci změn datového modelu pro migraci. Když zadáte příkaz pro vrácení aktualizace zpět, migrace volá metodu Down .

Jedná se o počáteční migraci vytvořenou add-migration InitialCreate při zadání příkazu. Parametr (InitialCreate v příkladu) se používá pro název souboru a může být jakýkoliv, co chcete. Obvykle zvolíte slovo nebo frázi, která shrnuje, co se provádí v migraci. Můžete například pojmenovat pozdější migraci AddDepartmentTable.

Pokud jste vytvořili počáteční migraci, když už databáze existuje, vygeneruje se kód pro vytvoření databáze, ale nemusí se spouštět, protože databáze už odpovídá datovému modelu. Když nasadíte aplikaci do jiného prostředí, ve kterém databáze ještě neexistuje, spustí se tento kód a vytvoří databázi, takže je vhodné ji nejprve otestovat. Proto jste změnili název databáze v připojovací řetězec dříve– aby migrace mohly vytvořit nový úplně od začátku.

  1. V okně konzoly Správce balíčků zadejte následující příkaz:

    update-database

    Příkaz update-database spustí metodu Up pro vytvoření databáze a pak spustí metodu Seed pro naplnění databáze. Stejný proces se po nasazení aplikace spustí automaticky v produkčním prostředí, jak je vidět v následující části.

  2. Pomocí Průzkumníka serveru zkontrolujte databázi, jak jste to udělali v prvním kurzu, a spuštěním aplikace ověřte, že vše stále funguje stejně jako předtím.

Nasazení do Azure

Zatím aplikace běží místně ve službě IIS Express ve vašem vývojovém počítači. Pokud ho chcete zpřístupnit jiným uživatelům přes internet, musíte ho nasadit na poskytovatele webového hostingu. V této části kurzu ho nasadíte do Azure. Tato část je nepovinná; můžete tento postup přeskočit a pokračovat v následujícím kurzu nebo můžete přizpůsobit pokyny v této části pro jiného poskytovatele hostingu podle vašeho výběru.

Nasazení databáze pomocí migrací Code First

K nasazení databáze použijete Migrace Code First. Když vytvoříte profil publikování, který použijete ke konfiguraci nastavení pro nasazení ze sady Visual Studio, zaškrtnete políčko s popiskem Aktualizovat databázi. Toto nastavení způsobí, že proces nasazení automaticky nakonfiguruje soubor Web.config aplikace na cílovém serveru tak, aby Code First používal třídu inicializátoruMigrateDatabaseToLatestVersion.

Visual Studio během procesu nasazení s databází nic nedělá, když kopíruje projekt na cílový server. Když spustíte nasazenou aplikaci a poprvé po nasazení přistupuje k databázi, code First zkontroluje, jestli databáze odpovídá datovému modelu. Pokud dojde k neshodě, Code First automaticky vytvoří databázi (pokud ještě neexistuje) nebo aktualizuje schéma databáze na nejnovější verzi (pokud databáze existuje, ale neodpovídá modelu). Pokud aplikace implementuje metodu Migrations Seed , spustí se metoda po vytvoření databáze nebo aktualizaci schématu.

Metoda Migrace Seed vloží testovací data. Pokud byste nasadili do produkčního prostředí, museli byste změnit metodu Seed tak, aby vkládala pouze data, která chcete vložit do produkční databáze. Například v aktuálním datovém modelu můžete chtít mít skutečné kurzy, ale fiktivní studenty ve vývojové databázi. Můžete napsat metodu Seed , která se načte při vývoji, a pak před nasazením do produkčního prostředí okomentovat fiktivní studenty. Nebo můžete napsat metodu Seed pro načtení pouze kurzů a zadat fiktivní studenty v testovací databázi ručně pomocí uživatelského rozhraní aplikace.

Získání účtu Azure

Budete potřebovat účet Azure. Pokud ho ještě nemáte, ale máte předplatné sady Visual Studio, můžete si aktivovat výhody předplatného. V opačném případě můžete během několika minut vytvořit bezplatný zkušební účet. Podrobnosti najdete v článku Bezplatná zkušební verze Azure.

Vytvoření webu a databáze SQL v Azure

Vaše webová aplikace v Azure se spustí ve sdíleném hostitelském prostředí, což znamená, že běží na virtuálních počítačích, které jsou sdílené s ostatními klienty Azure. Sdílené hostitelské prostředí je nízkonákladový způsob, jak začít v cloudu. Pokud se později zvýší váš webový provoz, může se aplikace škálovat tak, aby vyhovovala potřebám, a to spuštěním na vyhrazených virtuálních počítačích. Další informace o cenových možnostech služby Aplikace Azure najdete v tématu Ceny služby App Service.

Databázi nasadíte do databáze Azure SQL. SQL Database je cloudová relační databázová služba založená na technologiích SQL Serveru. Nástroje a aplikace, které pracují s SQL Serverem, také pracují s databází SQL.

  1. Na portálu pro správu Azure zvolte na levé kartě Vytvořit prostředek a pak v podokně Nový (nebo v okně) zvolte Zobrazit všechnydostupné prostředky. V okně Vše zvolte Web App + SQL. Nakonec zvolte Vytvořit.

    Vytvořit prostředek na webu Azure Portal

    Otevře se formulář pro vytvoření nové nové webové aplikace a prostředku SQL .

  2. Do pole Název aplikace zadejte řetězec, který se použije jako jedinečná adresa URL vaší aplikace. Úplná adresa URL se skládá z toho, co tady zadáte, a výchozí doménu služby Aplikace Azure Services (.azurewebsites.net). Pokud je název aplikace již pořízený, Průvodce vás upozorní červenou zprávou Název aplikace není k dispozici. Pokud je název aplikace dostupný, zobrazí se zelené zaškrtnutí.

  3. V okně Předplatné zvolte předplatné Azure, ve kterém se má služba App Service nacházet.

  4. V textovém poli Skupina prostředků zvolte skupinu prostředků nebo vytvořte novou. Toto nastavení určuje, ve kterém datovém centru se bude váš web spouštět. Další informace o skupinách prostředků najdete v tématu Skupiny prostředků.

  5. Vytvořte nový plán služby App Service kliknutím na oddíl služby App Service, Vytvořit nový a vyplňte plán služby App Service (může to být stejný název jako App Service), umístění a cenová úroveň (existuje bezplatná možnost).

  6. Klikněte na SQL Database a pak zvolte Vytvořit novou databázi nebo vyberte existující databázi.

  7. Do pole Název zadejte název databáze.

  8. Klikněte na pole Cílový server a pak vyberte Vytvořit nový server. Případně pokud jste server vytvořili dříve, můžete ho vybrat ze seznamu dostupných serverů.

  9. Zvolte oddíl Cenová úroveň a zvolte Free. Pokud potřebujete další prostředky, můžete databázi kdykoli vertikálně navýšit. Další informace o cenách Azure SQL najdete v tématu Ceny služby Azure SQL Database.

  10. Podle potřeby upravte kolaci .

  11. Zadejte uživatelské jméno správce SQL a heslo správce SQL.

    • Pokud jste vybrali nový server služby SQL Database, definujte nový název a heslo, které použijete později při přístupu k databázi.
    • Pokud jste vybrali server, který jste vytvořili dříve, zadejte přihlašovací údaje pro tento server.
  12. Shromažďování telemetrických dat je možné povolit pro Službu App Service pomocí Application Insights. S malou konfigurací shromažďuje Application Insights cenné události, výjimky, závislosti, žádosti a trasování informací. Další informace o Application Insights najdete ve službě Azure Monitor.

  13. Kliknutím na Vytvořit v dolní části označíte, že jste hotovi.

    Portál pro správu se vrátí na stránku Řídicí panel a oblast Oznámení v horní části stránky ukazuje, že se web vytváří. Po chvíli (obvykle méně než minutu) je oznámení, že nasazení proběhlo úspěšně. V navigačním panelu vlevo se nová služba App Service zobrazí v části App Services a nová databáze SQL se zobrazí v části Databáze SQL.

Nasadit aplikaci do Azure

  1. V sadě Visual Studio klikněte pravým tlačítkem myši na projekt v Průzkumník řešení a v místní nabídce vyberte Publikovat.

  2. Na stránce Vybrat cíl publikování zvolte App Service a pak vyberte Existující a pak zvolte Publikovat.

    Výběr cílové stránky publikování

  3. Pokud jste ještě nepřidali předplatné Azure v sadě Visual Studio, proveďte kroky na obrazovce. Tyto kroky umožňují sadě Visual Studio připojit se k vašemu předplatnému Azure, aby seznam služeb App Services obsahoval váš web.

  4. Na stránce App Service vyberte předplatné, do které jste přidali App Service. V části Zobrazení vyberte skupinu prostředků. Rozbalte skupinu prostředků, do které jste přidali Službu App Service, a pak vyberte službu App Service. Zvolte OK a publikujte aplikaci.

  5. V okně Výstup se zobrazí akce nasazení, které se provedly, a hlásí úspěšné dokončení nasazení.

  6. Po úspěšném nasazení se výchozí prohlížeč automaticky otevře na adrese URL nasazeného webu.

    Students_index_page_with_paging

    Vaše aplikace je teď spuštěná v cloudu.

V tuto chvíli byla databáze SchoolContext vytvořena v databázi Azure SQL, protože jste vybrali spustit Migrace Code First (spustí se při spuštění aplikace). Soubor Web.config na nasazeného webu byl změněn tak, aby inicializátor MigrateDatabaseToLatestVersion spustil při prvním čtení nebo zápisu dat v databázi (k tomu došlo při výběru karty Studenti ):

Výňatek souboru Web.config

Proces nasazení také vytvořil nový připojovací řetězec (SchoolContext_DatabasePublish), který Migrace Code First použít k aktualizaci schématu databáze a k vytvoření databáze.

Připojovací řetězec v souboru Web.config

Nasazenou verzi souboru Web.config najdete ve svém vlastním počítači ve službě ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. K nasazeným souborům Web.config můžete přistupovat sami pomocí protokolu FTP. Pokyny najdete v tématu ASP.NET nasazení webu pomocí sady Visual Studio: Nasazení aktualizace kódu. Postupujte podle pokynů, které začínají textem "Pokud chcete použít nástroj FTP, potřebujete tři věci: adresu URL FTP, uživatelské jméno a heslo".

Poznámka:

Webová aplikace neimplementuje zabezpečení, takže data může změnit každý, kdo najde adresu URL. Pokyny k zabezpečení webu najdete v tématu Nasazení aplikace Zabezpečené ASP.NET MVC s využitím členství, OAuth a databáze SQL do Azure. Ostatním uživatelům můžete zabránit v používání webu zastavením služby pomocí portálu pro správu Azure nebo Průzkumníka serveru v sadě Visual Studio.

Položka nabídky Zastavit službu App Service

Pokročilé scénáře migrace

Pokud nasadíte databázi spuštěním migrací automaticky, jak je znázorněno v tomto kurzu, a nasazujete ji na web, který běží na více serverech, můžete získat více serverů, které se pokoušejí spustit migrace současně. Migrace jsou atomické, takže pokud se dva servery pokusí spustit stejnou migraci, jedna bude úspěšná a druhá selže (za předpokladu, že se operace nedají provést dvakrát). Pokud se chcete těmto problémům vyhnout, můžete volat migrace ručně a nastavit vlastní kód tak, aby se to stalo jenom jednou. Další informace naleznete v tématu Spouštění a skriptování migrace z Code na blogu Rowan Millera a Migrate.exe (pro provádění migrací z příkazového řádku).

Informace o dalších scénářích migrace najdete v tématu Řada migrací screencastu.

Aktualizace konkrétní migrace

update-database -target MigrationName

Příkaz update-database -target MigrationName spustí cílovou migraci.

Ignorování změn migrace do databáze

Add-migration MigrationName -ignoreChanges

ignoreChanges vytvoří prázdnou migraci s aktuálním modelem jako snímkem.

Inicializátory code First

V části nasazení jste viděli , jak se používá inicializátor MigrateDatabaseToLatestVersion . Code First také poskytuje další inicializátory, včetně CreateDatabaseIfNotExists (výchozí), DropCreateDatabaseIfModelChanges (které jste použili dříve) a DropCreateDatabaseAlways. Inicializátor DropCreateAlways může být užitečný pro nastavení podmínek pro testy jednotek. Můžete také napsat vlastní inicializátory a můžete volat inicializátor explicitně, pokud nechcete čekat, dokud aplikace nečte nebo zapisuje do databáze.

Další informace o inicializátory naleznete v tématu Understanding Database Initializers in Entity Code First a kapitola 6 knihy Programming Entity Framework: Code First od Julie Lerman a Rowan Miller.

Získání kódu

Stažení dokončeného projektu

Další materiály

Odkazy na další prostředky Entity Framework najdete v tématu ASP.NET Přístup k datům – doporučené zdroje informací.

Další kroky

V tomto kurzu se naučíte:

  • Povolené migrace Code First
  • Nasazení aplikace v Azure (volitelné)

V dalším článku se dozvíte, jak vytvořit složitější datový model pro aplikaci ASP.NET MVC.