Partilhar via


ASP.NET Implantação da Web usando o Visual Studio: Preparando-se para implantação de banco de dados

Baixar o Projeto Inicial

Esta série de tutoriais mostra como implantar (publicar) um aplicativo Web ASP.NET para Serviço de Aplicativo do Azure Aplicativos Web ou para um provedor de hospedagem de terceiros usando o Visual Studio 2012 ou o Visual Studio 2010. Para obter informações sobre a série, consulte o primeiro tutorial da série.

Visão geral

Este tutorial mostra como preparar o projeto para a implantação do banco de dados. A estrutura do banco de dados e alguns (nem todos) dos dados nos dois bancos de dados do aplicativo devem ser implantados para testar, preparar e ambientes de produção.

Normalmente, ao desenvolver um aplicativo, você insere dados de teste em um banco de dados que não deseja implantar em um site ativo. No entanto, você também pode ter alguns dados de produção que deseja implantar. Neste tutorial, você configurará o projeto da Contoso University e preparará scripts SQL para que os dados corretos sejam incluídos quando você implantar.

Lembrete: se você receber uma mensagem de erro ou algo não funcionar à medida que passar pelo tutorial, certifique-se de marcar página de solução de problemas.

SQL Server Express LocalDB

O aplicativo de exemplo usa SQL Server Express LocalDB. SQL Server Express é a edição gratuita do SQL Server. Normalmente, ele é usado durante o desenvolvimento porque se baseia no mesmo mecanismo de banco de dados que as versões completas do SQL Server. Você pode testar com SQL Server Express e ter certeza de que o aplicativo se comportará da mesma forma em produção, com algumas exceções para recursos que variam entre SQL Server Editions.

LocalDB é um modo de execução especial de SQL Server Express que permite trabalhar com bancos de dados como arquivos .mdf. Normalmente, os arquivos de banco de dados LocalDB são mantidos na pasta App_Data de um projeto Web. O recurso de instância de usuário no SQL Server Express também permite que você trabalhe com arquivos .mdf, mas o recurso de instância do usuário foi preterido; portanto, o LocalDB é recomendado para trabalhar com arquivos .mdf.

Normalmente, SQL Server Express não é usado para aplicativos Web de produção. O LocalDB, em particular, não é recomendado para uso em produção com um aplicativo Web porque ele não foi projetado para funcionar com o IIS.

No Visual Studio 2012, o LocalDB é instalado por padrão com o Visual Studio. No Visual Studio 2010 e versões anteriores, SQL Server Express (sem LocalDB) é instalado por padrão com o Visual Studio; é por isso que você o instalou como um dos pré-requisitos no primeiro tutorial desta série.

Para obter mais informações sobre SQL Server edições, incluindo LocalDB, consulte os seguintes recursos Trabalhando com bancos de dados SQL Server.

Entity Framework e Provedores Universais

Para acesso ao banco de dados, o aplicativo da Contoso University requer o seguinte software que deve ser implantado com o aplicativo porque ele não está incluído no .NET Framework:

Como esse software está incluído em pacotes NuGet, o projeto já está configurado para que os assemblies necessários sejam implantados com o projeto. (Os links apontam para as versões atuais desses pacotes, que podem ser mais recentes do que o instalado no projeto inicial baixado para este tutorial.)

Se você estiver implantando em um provedor de hospedagem de terceiros em vez do Azure, use o Entity Framework 5.0 ou posterior. Versões anteriores do Migrações do Code First exigem Confiança Total, e a maioria dos provedores de hospedagem executará seu aplicativo em Confiança Média. Para obter mais informações sobre a Confiança Média, consulte o tutorial Implantar no IIS como um Ambiente de Teste .

Configurar Migrações do Code First para implantação de banco de dados de aplicativo

O banco de dados de aplicativos da Contoso University é gerenciado pelo Code First e você o implantará usando Migrações do Code First. Para obter uma visão geral da implantação do banco de dados usando Migrações do Code First, consulte o primeiro tutorial desta série.

Quando você implanta um banco de dados de aplicativo, normalmente você não simplesmente não implanta seu banco de dados de desenvolvimento com todos os dados nele para produção, pois grande parte dos dados nele provavelmente está lá apenas para fins de teste. Por exemplo, os nomes dos alunos em um banco de dados de teste são fictícios. Por outro lado, muitas vezes, você não pode implantar apenas a estrutura do banco de dados sem dados. Alguns dos dados no banco de dados de teste podem ser dados reais e devem estar lá quando os usuários começarem a usar o aplicativo. Por exemplo, seu banco de dados pode ter uma tabela que contém valores de nota válidos ou nomes de departamento reais.

Para simular esse cenário comum, você configurará um método Migrações do Code First Seed que insere no banco de dados apenas os dados que você deseja estar lá em produção. Esse Seed método não deve inserir dados de teste porque ele será executado em produção depois que o Code First criar o banco de dados em produção.

Em versões anteriores do Code First antes do lançamento das Migrações, era comum Seed que os métodos inserissem dados de teste também, pois a cada alteração de modelo durante o desenvolvimento o banco de dados tinha que ser completamente excluído e recriado do zero. 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 Seed método não é necessária. O projeto baixado usa o método de incluir todos os dados no Seed método de uma classe de inicializador. Neste tutorial, você desabilitará essa classe de inicializador e habilitará as Migrações. Em seguida, você atualizará o Seed método na classe de configuração Migrações para que ele insira apenas os dados que você deseja inserir na produção.

O diagrama a seguir ilustra o esquema do banco de dados do aplicativo:

School_database_diagram

Para esses tutoriais, você assumirá que as Student tabelas e Enrollment devem estar vazias quando o site for implantado pela primeira vez. As outras tabelas contêm dados que precisam ser pré-carregados quando o aplicativo fica ativo.

Desabilitar o inicializador

Como você usará Migrações do Code First, não é necessário usar o DropCreateDatabaseIfModelChanges inicializador Code First. O código para esse inicializador está no arquivo SchoolInitializer.cs no projeto ContosoUniversity.DAL. Uma configuração no appSettings elemento do arquivo Web.config faz com que esse inicializador seja executado sempre que o aplicativo tentar acessar o banco de dados pela primeira vez:

<appSettings>
  <add key="Environment" value="Dev" />
  <add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>

Abra o aplicativo Web.config arquivo e remova ou comente o add elemento que especifica a classe de inicializador Code First. O appSettings elemento agora tem esta aparência:

<appSettings>
  <add key="Environment" value="Dev" />
</appSettings>

Observação

Outra maneira de especificar uma classe de inicializador é fazer isso chamando Database.SetInitializer no Application_Start método no arquivo Global.asax . Se você estiver habilitando migrações em um projeto que usa esse método para especificar o inicializador, remova essa linha de código.

Observação

Se você estiver usando Visual Studio 2013, adicione as seguintes etapas entre as etapas 2 e 3: (a) No PMC, insira "entityframework update-package -version 6.1.1" para obter a versão atual do EF. Em seguida, (b) compile o projeto para obter uma lista de erros de build e corrigi-los. Exclua instruções using para namespaces que não existem mais, clique com o botão direito do mouse e clique em Resolver para adicionar instruções using em que são necessárias e altere as ocorrências de System.Data.EntityState para System.Data.Entity.EntityState.

Habilitar as Migrações Code First

  1. Verifique se o projeto ContosoUniversity (não ContosoUniversity.DAL) está definido como o projeto de inicialização. Em Gerenciador de Soluções, clique com o botão direito do mouse no projeto ContosoUniversity e selecione Definir como Projeto de Inicialização. Migrações do Code First procurará no projeto de inicialização para localizar a cadeia de conexão do banco de dados.

  2. No menu Ferramentas, escolha Console do Gerenciador de Pacotes do Gerenciador de Pacotes> do NuGet.

    Selecting_Package_Manager_Console

  3. Na parte superior da janela Console do Gerenciador de Pacotes , selecione ContosoUniversity.DAL como o projeto padrão e, no PM> prompt, insira "enable-migrations".

    Comando enable-migrations

    (Se você receber um erro informando que o comando enable-migrations não é reconhecido, insira o comando update-package EntityFramework -Reinstall e tente novamente.)

    Esse comando cria uma pasta Migrations no projeto ContosoUniversity.DAL e coloca nessa pasta dois arquivos: um arquivo Configuration.cs que você pode usar para configurar migrações e um arquivo InitialCreate.cs para a primeira migração que cria o banco de dados.

    Pasta Migrações

    Você selecionou o projeto DAL na lista suspensa Projeto padrão do Console do Gerenciador de Pacotes porque o enable-migrations comando deve ser executado no projeto que contém a classe de contexto Code First. Quando essa classe está em um projeto de biblioteca de classes, Migrações do Code First procura a cadeia de conexão de banco de dados no projeto de inicialização para a solução. Na solução ContosoUniversity, o projeto Web foi definido como o projeto de inicialização. Se você não quiser designar o projeto que tem a cadeia de conexão como o projeto de inicialização no Visual Studio, poderá especificar o projeto de inicialização no comando do PowerShell. Para ver a sintaxe de comando, insira o comando get-help enable-migrations.

    O enable-migrations comando criou automaticamente a primeira migração porque o banco de dados já existe. Uma alternativa é fazer com que as Migrações criem o banco de dados. Para fazer isso, use o Explorer do Servidor ou SQL Server Pesquisador de Objetos para excluir o banco de dados ContosoUniversity antes de habilitar as Migrações. Depois de habilitar as migrações, crie a primeira migração manualmente inserindo o comando "Add-migration InitialCreate". Em seguida, você pode criar o banco de dados inserindo o comando "update-database".

Configurar o método Seed

Para este tutorial, você adicionará dados fixos adicionando código ao Seed método da classe Migrações do Code FirstConfiguration. Migrações do Code First chama o Seed método após cada migração.

Como o Seed método é executado após cada migração, já há dados nas tabelas após a primeira migração. Para lidar com essa situação, você usará o AddOrUpdate método para atualizar linhas que já foram inseridas ou inseri-las se elas ainda não existirem. O AddOrUpdate método pode não ser a melhor opção para seu cenário. Para obter mais informações, consulte Tomar cuidado com o método AddOrUpdate do EF 4.3 no blog de Julie Lerman.

  1. Abra o arquivo Configuration.cs e substitua os comentários no Seed método pelo seguinte código:

    var instructors = new List<Instructor>
    {   
        new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
        new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
        new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
        new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15") },
        new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12") }
    };
    instructors.ForEach(s => context.Instructors.AddOrUpdate(i => i.LastName, s));
    context.SaveChanges();
    
    var departments = new List<Department>
    {
        new Department { Name = "English",     Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 1 },
        new Department { Name = "Mathematics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 2 },
        new Department { Name = "Engineering", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 3 },
        new Department { Name = "Economics",   Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 4 }
    };
    departments.ForEach(s => context.Departments.AddOrUpdate(d => d.Name, s));
    context.SaveChanges();
    
    var courses = new List<Course>
    {
        new Course { CourseID = 1050, Title = "Chemistry",      Credits = 3, DepartmentID = 3 },
        new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1 },
        new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1 }
    };
    courses.ForEach(s => context.Courses.AddOrUpdate(s));
    context.SaveChanges();
    
    courses[0].Instructors.Add(instructors[0]);
    courses[0].Instructors.Add(instructors[1]);
    courses[1].Instructors.Add(instructors[2]);
    courses[2].Instructors.Add(instructors[2]);
    courses[3].Instructors.Add(instructors[3]);
    courses[4].Instructors.Add(instructors[3]);
    courses[5].Instructors.Add(instructors[3]);
    courses[6].Instructors.Add(instructors[3]);
    context.SaveChanges();
    
  2. As referências para List ter linhas de rabiscos vermelhas sob elas porque você ainda não tem uma using instrução para seu namespace. Clique com o botão direito do mouse em uma das instâncias de List e clique em Resolver e, em seguida, clique em usando System.Collections.Generic.

    Resolver com a instrução using

    Essa seleção de menu adiciona o código a seguir às using instruções próximas à parte superior do arquivo.

    using System.Collections.Generic;
    
  3. Pressione CTRL-SHIFT-B para compilar o projeto.

O projeto agora está pronto para implantar o banco de dados ContosoUniversity . Depois de implantar o aplicativo, na primeira vez que o executar e navegar até uma página que acessa o banco de dados, o Code First criará o banco de dados e executará esse Seed método.

Observação

Adicionar código ao Seed método é uma das várias maneiras de inserir dados fixos no banco de dados. Uma alternativa é adicionar código aos Up métodos e Down de cada classe de migração. Os Up métodos e Down contêm código que implementa alterações de banco de dados. Você verá exemplos deles no tutorial Implantando uma atualização de banco de dados.

Você também pode escrever código que executa instruções SQL usando o Sql método . Por exemplo, se você estivesse adicionando uma coluna Orçamento à tabela Departamento e quisesse inicializar todos os orçamentos do departamento para US$ 1.000,00 como parte de uma migração, poderia adicionar a seguinte linha de código ao Up método para essa migração:

Sql("UPDATE Department SET Budget = 1000");

Criar scripts para implantação de banco de dados de associação

O aplicativo da Contoso University usa o sistema de associação ASP.NET e a autenticação de formulários para autenticar e autorizar usuários. A página Atualizar Créditos é acessível somente para usuários que estão na função Administrador.

Execute o aplicativo e clique em Cursos e, em seguida, clique em Atualizar Créditos.

Clique em Atualizar Créditos

A página Fazer logon é exibida porque a página Atualizar Créditos requer privilégios administrativos.

Insira administrador como o nome de usuário e devpwd como a senha e clique em Fazer logon.

Página de logon

A página Atualizar Créditos é exibida.

Página Atualizar Créditos

As informações de usuário e função estão no banco de dados aspnet-ContosoUniversity especificado pela cadeia de conexão DefaultConnection no arquivo Web.config .

Esse banco de dados não é gerenciado pelo Entity Framework Code First, portanto, você não pode usar migrações para implantá-lo. Você usará o provedor dbDacFx para implantar o esquema de banco de dados e configurará o perfil de publicação para executar um script que inserirá dados iniciais em tabelas de banco de dados.

Observação

Um novo sistema de associação de ASP.NET (agora chamado ASP.NET Identity) foi introduzido com Visual Studio 2013. O novo sistema permite que você mantenha tabelas de aplicativo e associação no mesmo banco de dados e você pode usar Migrações do Code First para implantar ambos. O aplicativo de exemplo usa o sistema de associação ASP.NET anterior, que não pode ser implantado usando Migrações do Code First. Os procedimentos para implantar esse banco de dados de associação também se aplicam a qualquer outro cenário em que seu aplicativo precise implantar um banco de dados SQL Server que não seja criado pelo Entity Framework Code First.

Aqui também, você normalmente não quer os mesmos dados em produção que você tem em desenvolvimento. Quando você implanta um site pela primeira vez, é comum excluir a maioria ou todas as contas de usuário que você cria para teste. Portanto, o projeto baixado tem dois bancos de dados de associação: aspnet-ContosoUniversity.mdf com usuários de desenvolvimento e aspnet-ContosoUniversity-Prod.mdf com usuários de produção. Para este tutorial, os nomes de usuário são os mesmos em ambos os bancos de dados: administrador e não administrador. Ambos os usuários têm a senha devpwd no banco de dados de desenvolvimento e prodpwd no banco de dados de produção.

Você implantará os usuários de desenvolvimento no ambiente de teste e nos usuários de produção para preparo e produção. Para fazer isso, você criará dois scripts SQL neste tutorial, um para desenvolvimento e outro para produção e, em tutoriais posteriores, você configurará o processo de publicação para executá-los.

Observação

O banco de dados de associação armazena um hash de senhas de conta. Para implantar contas de um computador para outro, você deve garantir que as rotinas de hash não gerem hashes diferentes no servidor de destino do que no computador de origem. Eles gerarão os mesmos hashes quando você usar o Provedores Universais ASP.NET, desde que você não altere o algoritmo padrão. O algoritmo padrão é HMACSHA256 e é especificado no atributo de validação do elemento machineKey no arquivo Web.config.

Você pode criar scripts de implantação de dados manualmente usando SQL Server Management Studio (SSMS) ou usando uma ferramenta de terceiros. Este restante deste tutorial mostrará como fazer isso no SSMS, mas se você não quiser instalar e usar o SSMS, poderá obter os scripts da versão concluída do projeto e pular para a seção em que os armazena na pasta da solução.

Para instalar o SSMS, instale-o no Centro de Download: Microsoft SQL Server 2012 Express clicando emENU\x64\SQLManagementStudio_x64_ENU.exe ou ENU\x86\SQLManagementStudio_x86_ENU.exe. Se você escolher o errado para seu sistema, ele falhará ao instalar e você poderá tentar o outro.

(Observe que este é um download de 600 megabytes. Pode levar muito tempo para instalar e exigirá uma reinicialização do computador.)

Na primeira página do Centro de Instalação do SQL Server, clique em Nova SQL Server instalação autônoma ou adicione recursos a uma instalação existente e siga as instruções, aceitando as opções padrão.

Criar o script do banco de dados de desenvolvimento

  1. Execute o SSMS.

  2. Na caixa de diálogo Conectar ao Servidor , insira (localdb)\v11.0 como o nome do servidor, deixe a Autenticação definida como Autenticação do Windows e clique em Conectar.

    SSMS Connect to Server

  3. Na janela Pesquisador de Objetos, expanda Bancos de Dados, clique com o botão direito do mouse em aspnet-ContosoUniversity, clique em Tarefase clique em Gerar Scripts.

    Gerar scripts do SSMS

  4. Na caixa de diálogo Gerar e Publicar Scripts , clique em Definir Opções de Script.

    Você pode ignorar a etapa Escolher Objetos porque o padrão é Script de banco de dados inteiro e todos os objetos de banco de dados e é isso que você deseja.

  5. Clique em Avançado.

    Opções de script do SSMS

  6. Na caixa de diálogo Opções avançadas de script , role para baixo até Tipos de dados para script e clique na opção Somente dados na lista suspensa.

  7. Altere Script USE DATABASE para False. As instruções USE não são válidas para SQL do Azure Banco de Dados e não são necessárias para a implantação SQL Server Express no ambiente de teste.

    Somente dados de script do SSMS, sem instrução USE

  8. Clique em OK.

  9. Na caixa de diálogo Gerar e Publicar Scripts , a caixa Nome do arquivo especifica onde o script será criado. Altere o caminho para a pasta da solução (a pasta que tem o arquivo ContosoUniversity.sln) e o nome do arquivo para aspnet-data-dev.sql.

  10. Clique em Avançar para ir para a guia Resumo e clique em Avançar novamente para criar o script.

    Script SSMS criado

  11. Clique em Concluir.

Criar o script de banco de dados de produção

Como você não executou o projeto com o banco de dados de produção, ele ainda não está anexado à instância do LocalDB. Portanto, você precisa anexar o banco de dados primeiro.

  1. No Pesquisador de Objetos do SSMS, clique com o botão direito do mouse em Bancos de Dados e clique em Anexar.

    Anexação do SSMS

  2. Na caixa de diálogo Anexar Bancos de Dados , clique em Adicionar e navegue até o arquivo aspnet-ContosoUniversity-Prod.mdf na pasta App_Data .

    SSMS Adicionar arquivo .mdf para anexar

  3. Clique em OK.

  4. Siga o mesmo procedimento usado anteriormente para criar um script para o arquivo de produção. Nomeie o arquivo de script comopnet-data-prod.sql.

Resumo

Os dois bancos de dados agora estão prontos para serem implantados e você tem dois scripts de implantação de dados na pasta da solução.

Scripts de implantação de dados

No tutorial a seguir, você define as configurações de projeto que afetam a implantação e configura transformações automáticas de arquivoWeb.config para configurações que devem ser diferentes no aplicativo implantado.

Mais informações

Para obter mais informações sobre o NuGet, consulte Gerenciar bibliotecas de projetos com a documentação do NuGet e do NuGet. Se você não quiser usar o NuGet, precisará aprender a analisar um pacote NuGet para determinar o que ele faz quando ele está instalado. (Por exemplo, ele pode configurar transformaçõesWeb.config , configurar scripts do PowerShell para serem executados em tempo de build etc.) Para saber mais sobre como o NuGet funciona, consulte Criando e publicando um pacote e transformações de arquivo de configuração e código-fonte.