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

Até agora, o aplicativo Web de exemplo da Contoso University está sendo executado localmente no IIS Express em seu computador de desenvolvimento. Para disponibilizar um aplicativo real para outras pessoas usarem pela Internet, você deve 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 do Code First. O recurso Migrações permite que você altere o modelo de dados e implante suas alterações na produção atualizando o esquema de banco de dados sem precisar descartar e recriar o banco de dados.
  • Implantar 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 controle do código-fonte para implantação, mas este tutorial não aborda esses tópicos. Para obter mais informações, consulte os capítulos de controle do código-fonte e integração contínua de Criando aplicativos de nuvem do mundo real com o Azure.

Neste tutorial, você:

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

Pré-requisitos

Habilitar migrações do Code First

Quando você desenvolve um novo aplicativo, o modelo de dados é alterado com frequência e, sempre 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 DbContext classe, na próxima vez que você executar o aplicativo, ele exclui automaticamente seu banco de dados existente, cria um novo que corresponde ao modelo e o propaga com dados de teste.

Esse método de manter o banco de dados em sincronia com o modelo de dados funciona bem até que você implante o aplicativo em produção. Quando o aplicativo está sendo executado em produção, ele geralmente armazena os dados que você deseja manter e você não deseja perder tudo sempre que fizer uma alteração, como adicionar uma nova coluna. O recurso Migrações do Code First 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. Desabilite o inicializador que você configurou anteriormente comentando ou excluindo o contexts elemento que você adicionou ao arquivo 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 cadeia 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 é obrigatório, mas você verá mais tarde por que é uma boa ideia.

  3. No menu Ferramentas, selecione Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes.

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

    enable-migrations
    add-migration InitialCreate
    

    O enable-migrations 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, as Migrações localizarão o banco de dados existente e executarão automaticamente o add-migration comando. Tudo bem, significa apenas que você não executará um teste do código de migração 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 Configuration classe inclui um Seed método.

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

    A finalidade 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 de banco de dados é atualizado após uma alteração no modelo de dados.

Configurar o método Seed

Ao descartar e recriar o banco de dados para cada alteração no modelo de dados, você usa o método da Seed classe inicializadora para inserir dados de teste, pois após cada alteração de modelo, o banco de dados é descartado e todos os dados de teste são perdidos. Com as Migrações do Code First, os dados de teste são retidos após as alterações do banco de dados, portanto, a inclusão de dados de teste no método Seed normalmente não é necessária. Na verdade, você não deseja que o Seed método insira dados de teste se estiver usando Migrações para implantar o banco de dados na produção, pois o Seed método será executado em produção. Nesse caso, você deseja que o Seed método 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 departamento reais na Department tabela quando o aplicativo estiver disponível em produção.

Para este tutorial, você usará Migrações para implantação, mas seu Seed método inserirá dados de teste de qualquer maneira para facilitar a visualização de como a funcionalidade do aplicativo funciona sem precisar 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 método SaveChanges após cada grupo de entidades, como é feito aqui, mas isso ajuda a localizar a origem de um problema se ocorrer uma exceção enquanto o código estiver 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 Seed método é executado toda vez que você executa o update-database comando, 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 ocorreriam se você tentasse inserir uma linha que já existe, mas substitui quaisquer alterações nos dados que você possa ter feito durante o teste do aplicativo. Com dados de teste em algumas tabelas, talvez você não queira que isso aconteça: em alguns casos, quando você altera dados durante o teste, deseja que suas 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 LastName propriedade pode ser usada para essa finalidade, pois cada sobrenome na lista é exclusivo:

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

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

    A sequência contém mais de um elemento

    Para obter informações sobre como lidar com dados redundantes, como dois alunos chamados "Alexander Carson", consulte Propagação e depuração de bancos de dados do EF (Entity Framework) no blog de Rick Anderson. Para obter mais informações sobre o AddOrUpdate método, consulte Cuidar do 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 ID valor nas entidades da students coleção, embora você 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 ID propriedade aqui porque o ID valor é definido quando você chama SaveChanges a students coleção. O EF obtém automaticamente o valor da chave primária quando insere uma entidade no banco de dados e atualiza a ID propriedade da entidade na memória.

    O código que adiciona cada Enrollment entidade ao Enrollments conjunto de entidades não usa o AddOrUpdate método. Ele verifica se uma entidade já existe e insere a entidade se ela não existir. Essa abordagem preservará as alterações feitas em uma nota de registro usando a interface do usuário do aplicativo. O código percorre cada membro da EnrollmentLista e, se o registro não for encontrado no banco de dados, ele adicionará o registro ao banco de dados. Na primeira vez que você atualizar o banco de dados, o banco de dados estará vazio, portanto, ele adicionará cada registro.

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

Executar a primeira migração

Quando você executou o add-migration comando, o Migrations gerou o código que criaria o banco de dados do zero. Esse código também está na pasta Migrações , no arquivo chamado <timestamp>_InitialCreate.cs. O Up método da classe cria as tabelas de banco de InitialCreate dados que correspondem aos conjuntos de entidades do modelo de dados e o Down método 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");
    }
}

As migrações chamam 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, as Migrações chamam o método Down.

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

Se você criou a migração inicial quando o banco de dados já existia, o código de criação de banco de dados é gerado, mas ele não precisa ser executado porque o banco de dados já corresponde ao modelo de dados. Quando você implantar o aplicativo em outro ambiente no qual o banco de dados ainda não existe, esse código será executado para criar o banco de dados; portanto, é uma boa ideia testá-lo primeiro. É por isso que você alterou o nome do banco de dados na cadeia de conexão anteriormente, para que as migrações possam criar um novo do zero.

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

    update-database

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

  2. Use o Gerenciador de Servidores para inspecionar o banco de dados como você 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 está sendo executado localmente no IIS Express em seu computador de desenvolvimento. Para disponibilizá-lo para outras pessoas usarem pela Internet, você precisa implantá-lo em um provedor de hospedagem na web. Nesta seção do tutorial, você o implantará no Azure. Esta seção é opcional; Você pode ignorar isso e continuar com o tutorial a seguir ou adaptar as instruções nesta seção para um provedor de hospedagem diferente de sua escolha.

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

Para implantar o banco de dados, você usará as Migrações do Code First. Ao criar o perfil de publicação usado 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 Web.config do aplicativo no servidor de destino para que o Code First use a MigrateDatabaseToLatestVersion classe de inicializador.

O Visual Studio não faz nada com o banco de dados durante o processo de implantação enquanto está copiando 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 de 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.

Seu método Migrations insere dados de Seed teste. Se você estivesse implantando em um ambiente de produção, teria que alterar o método para que ele insira apenas os Seed dados que você deseja inserir no banco de dados de produção. Por exemplo, em seu modelo de dados atual, talvez você queira ter cursos reais, mas alunos fictícios no banco de dados de desenvolvimento. Você pode escrever um Seed método para carregar ambos no desenvolvimento e, em seguida, comentar os alunos fictícios antes de implantar na produção. Ou você pode escrever um Seed método 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 será executado em VMs (máquinas virtuais) compartilhadas com outros clientes do Azure. Um ambiente de hospedagem compartilhado é uma maneira de começar na nuvem a um baixo custo. Mais tarde, se seu 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 Serviço de Aplicativo do Azure, 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 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. No Portal de Gerenciamento do Azure, escolha Criar um recurso na guia esquerda e, em seguida, escolha Ver tudo no painel ( ou folha) Novo para ver todos os recursos disponíveis. Escolha Aplicativo Web + 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 Novo Aplicativo Web + SQL é aberto.

  2. Insira uma cadeia de caracteres na caixa Nome do aplicativo para usar como a URL exclusiva do seu aplicativo. A URL completa consistirá no que você inserir aqui, além do domínio padrão dos Serviços de Aplicativos do Azure (.azurewebsites.net). Se o nome do aplicativo já estiver em uso, o Assistente notificará você com uma mensagem vermelha O nome do aplicativo não está disponível. Se o nome do aplicativo estiver disponível, você verá uma marca de seleção verde.

  3. Na caixa Assinatura, escolha a Assinatura do Azure na qual você deseja que o Serviço de Aplicativo resida.

  4. Na caixa de texto Grupo de Recursos, escolha um Grupo de Recursos ou crie um novo. Essa 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 do Serviço de Aplicativo clicando na seção Serviço de Aplicativo, Criar Novo e preencha Plano do Serviço de Aplicativo (pode ter o mesmo nome do Serviço de Aplicativo), Local e Tipo de Preço (há uma opção gratuita).

  6. Clique em Banco de Dados SQL e escolha Criar um novo banco de dados ou selecione um banco de dados existente.

  7. Na caixa Nome, insira um nome para o banco de dados.

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

  9. Escolha a seção Tipo de preço , escolha Gratuito. Se forem necessários recursos adicionais, o banco de dados poderá ser ampliado a qualquer momento. Para saber mais sobre os preços do SQL do Azure, confira Preços do Banco de Dados SQL do Azure.

  10. Modifique a ordenação conforme necessário.

  11. Insira um nome de usuário de administrador SQL e uma senha de administrador SQL.

    • Se você selecionou Novo servidor do Banco de Dados SQL, defina um novo nome e senha que você usará posteriormente ao acessar o banco de dados.
    • Se você selecionou um servidor criado anteriormente, insira as credenciais para esse 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 de evento, exceção, dependência, solicitação e rastreamento. Para saber mais sobre o Application Insights, consulte Azure Monitor.

  13. Clique em 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 Aplicativos 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 mouse no projeto no Gerenciador de Soluções e selecione Publicar no menu de contexto.

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

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

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

  4. Na página Serviço de Aplicativo, selecione a Assinatura à qual 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 o aplicativo.

  5. A janela Saída mostra quais ações de implantação foram executadas e os relatórios da conclusão com êxito da implantação.

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

    Students_index_page_with_paging

    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 você selecionou Executar Migrações do Code First (é executado na inicialização do aplicativo). O arquivo Web.config no site implantado foi alterado para que o inicializador MigrateDatabaseToLatestVersion seja executado na primeira vez que o código lê ou grava dados no banco de dados (o que aconteceu quando você selecionou a guia Alunos ):

Trecho do arquivo Web.config

O processo de implantação também criou uma nova cadeia de conexão (SchoolContext_DatabasePublish) para as Migrações do Code First usarem para atualizar o esquema de banco de dados e propagar o banco de dados.

Cadeia de conexão no arquivo 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 ASP.NET Implantação da Web usando o Visual Studio: implantando uma atualização de código. Siga as instruções que começam com "Para usar uma ferramenta de FTP, você precisa de três coisas: o URL do FTP, o nome de usuário e a senha".

Observação

O aplicativo Web não implementa segurança, portanto, qualquer pessoa que encontrar a URL pode alterar os dados. Para obter instruções sobre como proteger o site, consulte Implantar um aplicativo MVC do ASP.NET seguro 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 o Gerenciador de Servidores no Visual Studio.

Parar item de menu do serviço de aplicativo

Cenários de migrações avançadas

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 será bem-sucedido e o outro falhará (supondo que as operações não possam ser feitas duas vezes). Nesse cenário, se você quiser evitar esses problemas, poderá 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 Executando e criando scripts de migrações de código no blog e Migrate.exe de Rowan Miller (para executar migrações da linha de comando).

Para obter informações sobre outros cenários de migrações, consulte Série de Screencast de Migrações.

Atualizar migração específica

update-database -target MigrationName

O update-database -target MigrationName comando 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 do Code First

Na seção de implantação, você viu o inicializador MigrateDatabaseToLatestVersion sendo usado. O Code First também fornece outros inicializadores, incluindo CreateDatabaseIfNotExists (o padrão), DropCreateDatabaseIfModelChanges (que você usou anteriormente) e DropCreateDatabaseAlways. O DropCreateAlways inicializador pode ser útil para configurar condições para testes de unidade. Você também pode escrever seus próprios inicializadores e 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 Noções básicas sobre inicializadores de banco de dados no Entity Framework Code First e o capítulo 6 do livro Programming Entity Framework: Code First de Julie Lerman e Rowan Miller.

Obter o código

Baixe o projeto concluído

Recursos adicionais

Links para outros recursos do Entity Framework podem ser encontrados em ASP.NET Acesso a Dados – Recursos Recomendados.

Próximas etapas

Neste tutorial, você:

  • Migrações do Code First habilitadas
  • 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.