Partilhar via


Tutorial: Usar migrações EF em um aplicativo ASP.NET MVC e implantar no Azure

Até agora, o aplicativo Web de exemplo da Universidade Contoso tem sido executado localmente no IIS Express em seu computador de desenvolvimento. Para tornar um aplicativo real disponível para outras pessoas usarem pela Internet, você tem que implantá-lo em um provedor de hospedagem na web. Neste tutorial, você habilita as migrações do Code First e implanta o aplicativo na nuvem no Azure:

  • Habilite as migrações Code First. O recurso Migrações permite alterar o modelo de dados e implantar suas alterações na produção atualizando o esquema do banco de dados sem precisar descartar e recriar o banco de dados.
  • Implante no Azure. Esta etapa é opcional; Você pode continuar com os tutoriais restantes sem ter implantado o projeto.

Recomendamos que você use um processo de integração contínua com o controle do código-fonte para implantação, mas este tutorial não aborda esses tópicos. Para obter mais informações, consulte o Implantar um microsserviço .NET nativo da nuvem automaticamente com o GitHub Actions e o Azure Pipelines.

Neste tutorial, você:

  • Habilitar migrações Code First
  • Implantar o aplicativo no Azure (opcional)

Pré-requisitos

Habilitar migrações Code First

Quando você desenvolve um novo aplicativo, seu modelo de dados muda com freqüência e, cada vez que o modelo é alterado, ele fica fora de sincronia com o banco de dados. Você configurou o Entity Framework para descartar e recriar automaticamente o banco de dados sempre que alterar o modelo de dados. Quando você adiciona, remove ou altera classes de entidade ou altera sua classe DbContext, da próxima vez que executar o aplicativo, ele exclui automaticamente o banco de dados existente, cria um novo que corresponde ao modelo e o semeia com dados de teste.

Esse método de manter o banco de dados sincronizado com o modelo de dados funciona bem até que você implante o aplicativo na produção. Quando o aplicativo está sendo executado em produção, geralmente está armazenando dados que você deseja manter, e você não quer perder tudo cada vez que faz uma alteração, como adicionar uma nova coluna. O recurso Code First Migrations resolve esse problema permitindo que o Code First atualize o esquema do banco de dados em vez de descartar e recriar o banco de dados. Neste tutorial, você implantará o aplicativo e, para se preparar para isso, habilitará as migrações.

  1. Desative o inicializador que você configurou anteriormente comentando ou excluindo o elemento contexts que você adicionou ao arquivo de Web.config do aplicativo.

    <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. Também no arquivo Web.config do aplicativo, altere o nome do banco de dados na string de conexão para ContosoUniversity2.

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

    Essa alteração configura o projeto para que a primeira migração crie um novo banco de dados. Isso não é necessário, mas você verá mais tarde por que é uma boa ideia.

  3. No menu Ferramentas, selecione Gestor de Pacotes NuGet>Consola do Gestor de Pacotes.

  4. No prompt PM>, digite os seguintes comandos:

    enable-migrations
    add-migration InitialCreate
    

    O comando cria uma pasta Migrações no projeto ContosoUniversity e coloca nessa pasta um arquivo Configuration.cs que você pode editar para configurar Migrações.

    (Se você perdeu a etapa acima que o direciona para alterar o nome do banco de dados, Migrações encontrará o banco de dados existente e executará automaticamente o comando add-migration. Tudo bem, significa apenas que você não executará um teste do código de migrações antes de implantar o banco de dados. Mais tarde, quando você executar o comando update-database nada acontecerá porque o banco de dados já existe.)

    Abra o arquivo ContosoUniversity\Migrations\Configuration.cs. Como a classe inicializador que você viu anteriormente, a classe Configuration inclui um método 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" }
            //    );
            //
        }
    }
    

    O objetivo do método Seed é permitir que você insira ou atualize dados de teste depois que o Code First cria ou atualiza o banco de dados. O método é chamado quando o banco de dados é criado e sempre que o esquema do banco de dados é atualizado após uma alteração no modelo de dados.

Configurar o método Seed

Quando elimina e recria a base de dados para cada alteração no modelo de dados, utiliza o método Seed da classe de inicialização para inserir dados de teste, porque após cada alteração de modelo, a base de dados é eliminada e todos os dados de teste são perdidos. Com as migrações Code First, os dados de teste são retidos após as alterações no banco de dados, portanto, incluir dados de teste no método Seed normalmente não é necessário. Na verdade, você não deseja que o método Seed insira dados de teste se estiver usando Migrações para implantar o banco de dados na produção, porque o método Seed será executado na produção. Nesse caso, você deseja que o método Seed insira no banco de dados apenas os dados necessários na produção. Por exemplo, talvez você queira que o banco de dados inclua nomes de departamentos reais na tabela Department quando o aplicativo estiver disponível em produção.

Para este tutorial, você usará Migrações para implantação, mas seu método Seed inserirá dados de teste de qualquer maneira para facilitar a visualização de como a funcionalidade do aplicativo funciona sem ter que inserir manualmente muitos dados.

  1. Substitua o conteúdo do arquivo Configuration.cs pelo código a seguir, que carrega dados de teste no novo banco de dados.

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

    O método Seed usa o objeto de contexto do banco de dados como um parâmetro de entrada, e o código no método usa esse objeto para adicionar novas entidades ao banco de dados. Para cada tipo de entidade, o código cria uma coleção de novas entidades, adiciona-as à propriedade DbSet apropriada e salva as alterações no banco de dados. Não é necessário chamar o SaveChanges método após cada grupo de entidades, como é feito aqui, mas fazer isso ajuda a localizar a origem de um problema se ocorrer uma exceção enquanto o código está gravando no banco de dados.

    Algumas das instruções que inserem dados usam o método AddOrUpdate para executar uma operação "upsert". Como o método Seed é executado sempre que você executa o comando update-database, normalmente após cada migração, você não pode simplesmente inserir dados, porque as linhas que você está tentando adicionar já estarão lá após a primeira migração que cria o banco de dados. A operação "upsert" evita erros que aconteceriam se você tentar inserir uma linha que já existe, mas substitui quaisquer alterações nos dados que você possa ter feito durante o teste do aplicativo. Com os dados de teste em algumas tabelas, você pode não querer que isso aconteça: em alguns casos, quando você altera os dados durante o teste, deseja que as alterações permaneçam após as atualizações do banco de dados. Nesse caso, você deseja fazer uma operação de inserção condicional: insira uma linha somente se ela ainda não existir. O método Seed usa ambas as abordagens.

    O primeiro parâmetro passado para o método AddOrUpdate especifica a propriedade a ser usada para verificar se uma linha já existe. Para os dados do aluno de teste que você está fornecendo, a propriedade LastName pode ser usada para essa finalidade, uma vez que cada sobrenome na lista é exclusivo:

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

    Este código pressupõe que os sobrenomes são exclusivos. Se você adicionar manualmente um aluno com um sobrenome duplicado, obterá a seguinte exceção na próxima vez que executar uma migração:

    Sequence contém mais de um elemento

    Para obter informações sobre como lidar com dados redundantes, como dois alunos chamados "Alexander Carson", consulte Seeding and Debugging Entity Framework (EF) DBs no blog de Rick Anderson. Para obter mais informações sobre o método AddOrUpdate, consulte Cuidado com o Método AddOrUpdate do EF 4.3 no blog de Julie Lerman.

    O código que cria Enrollment entidades pressupõe que você tenha o valor ID nas entidades na coleção students, embora não tenha definido essa propriedade no código que cria a coleção.

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

    Você pode usar a propriedade ID aqui porque o valor ID é definido quando você chama SaveChanges para a coleção students. O EF obtém automaticamente o valor da chave primária quando insere uma entidade no banco de dados e atualiza a propriedade ID da entidade na memória.

    O código que adiciona cada entidade Enrollment ao conjunto de entidades Enrollments não usa o método AddOrUpdate. Ele verifica se uma entidade já existe e insere a entidade se ela não existir. Essa abordagem preservará as alterações que fizeres numa nota de matrícula através da interface de utilizador da aplicação. O código percorre cada membro da lista Enrollment e, se a inscrição não for encontrada no banco de dados, adiciona a inscrição ao banco de dados. Na primeira vez que você atualizar o banco de dados, o banco de dados estará vazio, portanto, ele adicionará cada inscrição.

    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. Construa o projeto.

Executar a primeira migração

Quando você executou o comando add-migration, Migrations gerou o código que criaria o banco de dados do zero. Esse código também está na pasta Migrations, no arquivo chamado <timestamp>_InitialCreate.cs. O método Up da classe InitialCreate cria as tabelas de banco de dados que correspondem aos conjuntos de entidades do modelo de dados e o método Down as exclui.

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

Migrações chama o método Up para implementar as alterações do modelo de dados para uma migração. Quando você insere um comando para reverter a atualização, Migrations chama o método Down.

Esta é a migração inicial que foi criada quando você inseriu o comando add-migration InitialCreate. O parâmetro (InitialCreate no exemplo) é usado para o nome do arquivo e pode ser o que você quiser; Normalmente, você escolhe uma palavra ou frase que resume o que está sendo feito na migração. Por exemplo, você pode nomear uma migração posterior como "AddDepartmentTable".

Se você criou a migração inicial quando o banco de dados já existe, o código de criação do banco de dados é gerado, mas não precisa ser executado porque o banco de dados já corresponde ao modelo de dados. Quando você implanta o aplicativo em outro ambiente onde o banco de dados ainda não existe, esse código será executado para criar seu banco de dados, portanto, é uma boa ideia testá-lo primeiro. É por isso que alteraste o nome da base de dados na cadeia de conexão anteriormente, para que as migrações possam criar uma nova de raiz.

  1. Na janela do Gestor de Pacotes Console, digite o seguinte comando:

    update-database

    O comando update-database executa o método Up para criar o banco de dados e, em seguida, executa o método Seed para preencher o banco de dados. O mesmo processo será executado automaticamente na produção após a implantação do aplicativo, como você verá na seção a seguir.

  2. Use Server Explorer para inspecionar o banco de dados como fez no primeiro tutorial e execute o aplicativo para verificar se tudo ainda funciona da mesma forma que antes.

Implantar no Azure

Até agora, o aplicativo tem sido executado localmente no IIS Express em seu computador de desenvolvimento. Para torná-lo disponível para outras pessoas usarem pela Internet, você tem que implantá-lo em um provedor de hospedagem na web. Nesta seção do tutorial, você o implantará no Azure. Esta secção é opcional; Você pode pular isso e continuar com o tutorial a seguir, ou você pode adaptar as instruções nesta seção para um provedor de hospedagem diferente de sua escolha.

Usar migrações Code First para implantar o banco de dados

Para implantar o banco de dados, você usará as migrações Code First. Ao criar o perfil de publicação que você usa para definir as configurações de implantação do Visual Studio, você marcará uma caixa de seleção rotulada Atualizar Banco de Dados. Essa configuração faz com que o processo de implantação configure automaticamente o arquivo de Web.config do aplicativo no servidor de destino para que o Code First use a classe inicializador MigrateDatabaseToLatestVersion.

O Visual Studio não faz nada com o banco de dados durante o processo de implantação enquanto copia seu projeto para o servidor de destino. Quando você executa o aplicativo implantado e ele acessa o banco de dados pela primeira vez após a implantação, o Code First verifica se o banco de dados corresponde ao modelo de dados. Se houver uma incompatibilidade, o Code First criará automaticamente o banco de dados (se ele ainda não existir) ou atualizará o esquema do banco de dados para a versão mais recente (se um banco de dados existir, mas não corresponder ao modelo). Se o aplicativo implementar um método Migrations Seed, o método será executado depois que o banco de dados for criado ou o esquema for atualizado.

O seu método Migrations Seed insere dados de teste. Se você estivesse implantando em um ambiente de produção, teria que alterar o método Seed para que ele insira apenas os dados que você deseja inserir em seu banco de dados de produção. Por exemplo, no seu modelo de dados atual, você pode querer ter cursos reais, mas alunos fictícios no banco de dados de desenvolvimento. Você pode escrever um método Seed para carregar ambos os elementos em desenvolvimento e, em seguida, comentar os alunos fictícios antes de implantar na produção. Ou você pode escrever um método Seed para carregar apenas cursos e inserir os alunos fictícios no banco de dados de teste manualmente usando a interface do usuário do aplicativo.

Obter uma conta do Azure

Você precisará de uma conta do Azure. Se você ainda não tiver uma, mas tiver uma assinatura do Visual Studio, poderá ativar os benefícios da assinatura. Caso contrário, você pode criar uma conta de avaliação gratuita em apenas alguns minutos. Para obter detalhes, consulte Avaliação Gratuita do Azure.

Criar um site e um banco de dados SQL no Azure

Seu aplicativo Web no Azure será executado em um ambiente de hospedagem compartilhada, o que significa que ele é executado em máquinas virtuais (VMs) que são compartilhadas com outros clientes do Azure. Um ambiente de hospedagem compartilhada é uma maneira de baixo custo de começar na nuvem. Mais tarde, se o tráfego da Web aumentar, o aplicativo poderá ser dimensionado para atender à necessidade executando em VMs dedicadas. Para saber mais sobre as Opções de Preços do Azure App Service, leia preços do Serviço de Aplicativo.

Você implantará o banco de dados no banco de dados SQL do Azure. O banco de dados SQL é um serviço de banco de dados relacional baseado em nuvem que é criado em tecnologias do SQL Server. Ferramentas e aplicativos que funcionam com o SQL Server também funcionam com o banco de dados SQL.

  1. NoPortal de Gerenciamento do Azure, escolha Criar um recurso na guia à esquerda e, em seguida, escolha Ver todas no painel Novo (ou seção) para ver todos os recursos disponíveis. Escolha Web App + SQL na seção Web da folha Tudo. Por fim, escolha Criar.

    Criar um recurso no portal do Azure

    O formulário para criar um novo recurso New Web App + SQL é aberto.

  2. Insira uma cadeia de caracteres na caixa Nome do aplicativo para usar como URL exclusivo para seu aplicativo. A URL completa consistirá no que você inserir aqui mais o domínio padrão dos Serviços de Aplicativo do Azure (.azurewebsites.net). Se o Nome da aplicação já estiver a ser utilizado, o Assistente notifica-o com uma mensagem em vermelho O nome da aplicação não está disponível. Se o nome da aplicação estiver disponível, verá uma marca de seleção verde.

  3. Na caixa de Subscrição , escolha a Subscrição do Azure na qual pretende que a do Serviço de Aplicações resida.

  4. Na caixa de texto Grupo de Recursos, escolha um Grupo de Recursos ou crie um novo. Esta configuração especifica em qual data center seu site será executado. Para obter mais informações sobre Grupos de Recursos, consulte Grupos de Recursos.

  5. Crie um novo Plano de Serviço de Aplicações clicando na secção de Serviço de Aplicações, selecione Criar Novoe preencha o plano de Serviço de Aplicações (pode ter o mesmo nome do Serviço de Aplicações), a Localizaçãoe o Nível de Preço (há uma opção gratuita).

  6. Clique em Base de Dados SQLe escolha a opção Criar uma nova base de dados ou selecione uma base de dados existente.

  7. Na caixa Nome , introduza um nome para a sua base de dados.

  8. Clique na caixa Servidor de Destino e, em seguida, selecione Criar um novo servidor. Como alternativa, se você criou um servidor anteriormente, poderá selecioná-lo na lista de servidores disponíveis.

  9. Escolha Nível de preço seção, escolha Grátis. Se forem necessários recursos adicionais, o banco de dados pode ser ampliado a qualquer momento. Para saber mais sobre os preços do Banco de Dados SQL do Azure, consulte preços do Banco de Dados SQL do Azure.

  10. Modifique agrupamento conforme necessário.

  11. Introduza um administrador de Utilizador de Administrador SQL e Palavra-passe de Administrador do SQL.

    • Se você selecionou Novo servidor do Banco de dados SQL, defina um novo nome e senha que você usará mais tarde quando acessar o banco de dados.
    • Se você selecionou um servidor criado anteriormente, insira as credenciais desse servidor.
  12. A coleta de telemetria pode ser habilitada para o Serviço de Aplicativo usando o Application Insights. Com pouca configuração, o Application Insights coleta informações valiosas sobre eventos, exceções, dependências, solicitações e rastreamento. Para saber mais sobre o Application Insights, consulte Azure Monitor.

  13. Clique Criar na parte inferior para indicar que você terminou.

    O Portal de Gerenciamento retorna à página Painel e a área Notificações na parte superior da página mostra que o site está sendo criado. Depois de um tempo (normalmente menos de um minuto), há uma notificação de que a implantação foi bem-sucedida. Na barra de navegação à esquerda, o novo Serviço de Aplicativo aparece na seção Serviços de Aplicativo e o novo banco de dados SQL aparece na seção bancos de dados SQL.

Implantar o aplicativo no Azure

  1. No Visual Studio, clique com o botão direito do rato no projeto em Explorador de Soluções e selecione Publicar no menu de contexto.

  2. Na página Escolha um destino de publicação, escolha Serviço de Aplicativo e Selecionar Existente, e em seguida, escolha Publicar.

    Escolha uma página de destino de publicação

  3. Se você não tiver adicionado anteriormente sua assinatura do Azure no Visual Studio, execute as etapas na tela. Estas etapas permitem que o Visual Studio se conecte à sua assinatura do Azure para que a lista de Serviços de Aplicativo inclua seu site.

  4. Na página do Serviço de Aplicativo, selecione a Assinatura à qual você adicionou o Serviço de Aplicativo você adicionou o Serviço de Aplicativo. Em Exibir, selecione Grupo de Recursos. Expanda o grupo de recursos ao qual você adicionou o Serviço de Aplicativo e selecione o Serviço de Aplicativo. Escolha OK para publicar a aplicação.

  5. A janela Output mostra quais ações de implantação foram tomadas e relata a conclusão bem-sucedida da implantação.

  6. Após a implantação bem-sucedida, o navegador padrão abre automaticamente a URL do site implantado.

    Página_de_índice_de_estudantes_com_páginação

    Seu aplicativo agora está sendo executado na nuvem.

Neste ponto, o banco de dados SchoolContext foi criado no banco de dados SQL do Azure porque escolheste Executar as migrações de Code First (executa no início da aplicação). O arquivo Web.config no site implantado foi alterado para que o inicializador MigrateDatabaseToLatestVersion seja executado na primeira vez que seu código lê ou grava dados no banco de dados (o que aconteceu quando você selecionou a guia Alunos):

Web.config excerto do ficheiro

O processo de implantação também criou uma nova cadeia de ligação (SchoolContext_DatabasePublish) para as migrações Code First a serem usadas para atualizar o esquema da base de dados e preencher a base de dados.

Cadeia de conexão no ficheiro Web.config

Você pode encontrar a versão implantada do arquivo Web.config em seu próprio computador em ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. Você pode acessar o próprio arquivo Web.config implantado usando FTP. Para obter instruções, consulte Implementação Web ASP.NET usando o Visual Studio: implementação de uma atualização de código. Siga as instruções que começam com "Para usar uma ferramenta FTP, você precisa de três coisas: a URL do FTP, o nome de usuário e a senha."

Observação

A aplicação Web não implementa segurança, pelo que qualquer pessoa que encontre o URL pode alterar os dados. Para obter instruções sobre como proteger o site, consulte implantar um aplicativo Secure ASP.NET MVC com associação, OAuth e banco de dados SQL no Azure. Você pode impedir que outras pessoas usem o site interrompendo o serviço usando o Portal de Gerenciamento do Azure ou Server Explorer no Visual Studio.

Parar item de menu do serviço de aplicativo

Cenários avançados de migrações

Se você implantar um banco de dados executando migrações automaticamente, conforme mostrado neste tutorial, e estiver implantando em um site executado em vários servidores, poderá obter vários servidores tentando executar migrações ao mesmo tempo. As migrações são atômicas, portanto, se dois servidores tentarem executar a mesma migração, um terá êxito e o outro falhará (assumindo que as operações não podem ser feitas duas vezes). Nesse cenário, se quiser evitar esses problemas, você pode chamar migrações manualmente e configurar seu próprio código para que isso aconteça apenas uma vez. Para obter mais informações, consulte Running and Scripting Migrations from Code no blog e Migrate.exe de Rowan Miller (para executar migrações a partir da linha de comando).

Para obter informações sobre outros cenários de migração, consulte Migrations Screencast Series.

Atualizar a migração específica

update-database -target MigrationName

O comando update-database -target MigrationName executa a migração de destino.

Ignorar alterações de migração para o banco de dados

Add-migration MigrationName -ignoreChanges

ignoreChanges cria uma migração vazia com o modelo atual como um instantâneo.

Inicializadores de "Code First"

Na seção de implantação, viu-se o inicializador MigrateDatabaseToLatestVersion a ser usado. Code First também fornece outros inicializadores, incluindo CreateDatabaseIfNotExists (o padrão), DropCreateDatabaseIfModelChanges (que você usou anteriormente) e DropCreateDatabaseAlways. O inicializador DropCreateAlways pode ser útil para configurar condições para testes de unidade. Você também pode escrever seus próprios inicializadores e pode chamar um inicializador explicitamente se não quiser esperar até que o aplicativo leia ou grave no banco de dados.

Para obter mais informações sobre inicializadores, consulte Understanding Database Initializers in Entity Framework Code First e o capítulo 6 do livro Programming Entity Framework: Code First por Julie Lerman e Rowan Miller.

Obter o código

Faça o download do projeto concluído

Recursos adicionais

Links para outros recursos do Entity Framework podem ser encontrados em ASP.NET Data Access - Recommended Resources.

Próximos passos

Neste tutorial, você:

  • Migrações Code First ativadas
  • Implantou o aplicativo no Azure (opcional)

Avance para o próximo artigo para saber como criar um modelo de dados mais complexo para um aplicativo MVC ASP.NET.