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

Até agora, o aplicativo Web de exemplo da Contoso University foi executado localmente em IIS Express em seu computador de desenvolvimento. Para disponibilizar um aplicativo real para outras pessoas usarem pela Internet, você precisa 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:

  • Habilitar 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 o 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 da criação de aplicativos de nuvem Real-World 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 remover 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 o banco de dados existente, cria um novo que corresponde ao modelo e propaga-o 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á em execução em produção, ele geralmente armazena dados que você deseja manter e você não quer perder tudo sempre que fizer uma alteração, como adicionar uma nova coluna. O recurso Migrações do Code First resolve esse problema habilitando o Code First para atualizar o esquema de 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 aplicativo Web.config arquivo.

    <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 deWeb.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 é necessá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. PM> No prompt, insira 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 as Migrações.

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

    Abra o arquivo ContosoUniversity\Migrations\Configuration.cs . Como a classe de 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 criar ou atualizar o banco de dados. O método é chamado quando o banco de dados é criado e toda vez que o esquema de banco de dados é atualizado após uma alteração de modelo de dados.

Configurar o método Seed

Ao descartar e recriar o banco de dados para cada alteração de modelo de dados, você usa o método da classe de Seed inicializador 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 Migrações do Code First, os dados de teste são retidos após alterações no 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 em 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 ficar 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 de 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 fazer isso ajuda a localizar a origem de um problema se ocorrer uma exceção enquanto o código está sendo escrito 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, pois 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" impede erros que aconteceriam se você tentasse inserir uma linha que já existe, mas ela substitui todas as alterações nos dados que você pode ter feito ao testar o aplicativo. Com os 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 marcar se uma linha já existir. 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 sejam 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 Tomar 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 ID valor nas entidades na 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 para 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 existe. Essa abordagem preservará as alterações feitas em uma nota de registro usando a interface do usuário do aplicativo. O código executa um loop em 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 , as migrações geraram 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 InitialCreate classe cria as tabelas de banco de dados que correspondem aos conjuntos de entidades do modelo de dados e o método as Down 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 em produção depois de implantar o aplicativo, como você verá na seção a seguir.

  2. Use o Servidor Explorer 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 foi executado localmente em 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á Migrações do Code First. Ao criar o perfil de publicação que você usa para definir as configurações de implantação do Visual Studio, você selecionará uma caixa de marcar rotulada Atualizar Banco de Dados. Essa configuração faz com que o processo de implantação configure automaticamente o arquivo Web.config 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 ele 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 ainda não existir) ou atualizará o esquema de banco de dados para a versão mais recente (se houver um banco de dados, 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 método Migrations Seed insere dados de teste. Se você estivesse implantando em um ambiente de produção, teria que alterar o Seed método para que ele insira apenas os dados que você deseja inserir no banco de dados de produção. Por exemplo, no 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 em 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ê poderá 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 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 opções de preços para Serviço de Aplicativo do Azure, leia Serviço de Aplicativo preços.

Você implantará o banco de dados em SQL do Azure banco de dados. O banco de dados SQL é um serviço de banco de dados relacional baseado em nuvem criado em tecnologias de SQL Server. Ferramentas e aplicativos que funcionam com 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 escolha Ver tudo no painel Novo (ou folha) 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 aplicativo Web + recurso SQL é aberto.

  2. Insira uma cadeia de caracteres na caixa Nome do aplicativo a ser usada como a URL exclusiva para seu aplicativo. A URL completa consistirá no que você inserir aqui mais o domínio padrão do Azure App Services (.azurewebsites.net). Se o nome do aplicativo já tiver sido usado, o Assistente notificará você com um vermelho 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 de Serviço de Aplicativo clicando na seção Serviço de Aplicativo, Criar Novo e preencha Serviço de Aplicativo plano (pode ser o mesmo nome que Serviço de Aplicativo), Local e Tipo de preço (há um tipo gratuito opção).

  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 escalado verticalmente a qualquer momento. Para saber mais sobre preços de SQL do Azure, consulte preços do banco de dados SQL do Azure.

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

  11. Insira um administrador SQL Administração Nome de usuário e senha de Administração SQL.

    • Se você selecionou Novo servidor 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 coleção de telemetria pode ser habilitada para 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, confira 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. Após 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 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, 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 para a URL do site implantado.

    Students_index_page_with_paging

    Seu aplicativo agora está em execução 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 no início 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 ler ou gravar dados no banco de dados (o que aconteceu quando você selecionou a guia Alunos ):

Web.config trecho do arquivo

O processo de implantação também criou uma nova cadeia de conexão (SchoolContext_DatabasePublish) para Migrações do Code First usar 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 no 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 FTP, você precisa de três coisas: a URL ftp, o nome de usuário e a senha".

Observação

O aplicativo Web não implementa a 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 Seguro 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 o Servidor 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 que é 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á (supondo que as operações não possam ser feitas duas vezes). Nesse cenário, se você quiser evitar esses problemas, poderá chamar as migrações manualmente e configurar seu próprio código para que ele só aconteça uma vez. Para obter mais informações, consulte Migrações de execução e script do 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 Migrations Screencast Series.

Atualizar migração específica

update-database -target MigrationName

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

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

Add-migration MigrationName -ignoreChanges

ignoreChangescria 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 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 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

Baixar 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
  • Implantado o aplicativo no Azure (opcional)

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