Compartilhar via


Implantando um aplicativo Web ASP.NET com SQL Server Compact usando o Visual Studio ou o Visual Web Developer: Implantando bancos de dados SQL Server Compact – 2 de 12

por Tom Dykstra

Baixar o Projeto Inicial

Esta série de tutoriais mostra como implantar (publicar) um projeto de aplicativo Web ASP.NET que inclui um banco de dados SQL Server Compact usando o Visual Studio 2012 RC ou o Visual Studio Express RC 2012 para Web. Você também poderá usar o Visual Studio 2010 se instalar a Atualização de Publicação na Web. Para obter uma introdução à série, consulte o primeiro tutorial da série.

Para obter um tutorial que mostra os recursos de implantação introduzidos após o lançamento do RC do Visual Studio 2012, mostra como implantar SQL Server edições diferentes de SQL Server Compact e mostra como implantar no Serviço de Aplicativo do Azure Aplicativos Web, confira Implantação da Web ASP.NET usando o Visual Estúdio.

Visão geral

Este tutorial mostra como configurar dois bancos de dados SQL Server Compact e o mecanismo de banco de dados para implantação.

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

A estrutura do banco de dados e alguns (não todos) dos dados nos dois bancos de dados do aplicativo também devem ser implantados. Normalmente, à medida que você desenvolve um aplicativo, insere dados de teste em um banco de dados que não deseja implantar em um site ativo. No entanto, você também pode inserir alguns dados de produção que deseja implantar. Neste tutorial, você configurará o projeto da Contoso University para que o software necessário e os dados corretos sejam incluídos durante a implantação.

Lembrete: se você receber uma mensagem de erro ou algo não funcionar durante o tutorial, marcar página de solução de problemas.

SQL Server Compact versus SQL Server Express

O aplicativo de exemplo usa SQL Server Compact 4.0. Esse mecanismo de banco de dados é uma opção relativamente nova para sites; Versões anteriores do SQL Server Compact não funcionam em um ambiente de hospedagem na Web. SQL Server Compact oferece alguns benefícios em comparação com o cenário mais comum de desenvolvimento com SQL Server Express e implantação em SQL Server completos. Dependendo do provedor de hospedagem escolhido, SQL Server Compact pode ser mais barato de implantar, pois alguns provedores cobram extra para dar suporte a um banco de dados SQL Server completo. Não há nenhum custo extra para SQL Server Compact porque você pode implantar o próprio mecanismo de banco de dados como parte do aplicativo Web.

No entanto, você também deve estar ciente de suas limitações. SQL Server Compact não dá suporte a procedimentos armazenados, gatilhos, exibições ou replicação. (Para obter uma lista completa dos recursos de SQL Server que não são compatíveis com SQL Server Compact, consulte Diferenças entre SQL Server Compact e SQL Server.) Além disso, algumas das ferramentas que você pode usar para manipular esquemas e dados em bancos de dados SQL Server Express e SQL Server não funcionam com SQL Server Compact. Por exemplo, você não pode usar SQL Server Management Studio ou SQL Server Data Tools no Visual Studio com bancos de dados SQL Server Compact. Você tem outras opções para trabalhar com bancos de dados SQL Server Compact:

  • Você pode usar o Explorer do Servidor no Visual Studio, que oferece funcionalidade limitada de manipulação de banco de dados para SQL Server Compact.
  • Você pode usar o recurso de manipulação de banco de dados do WebMatrix, que tem mais recursos do que o Explorer de servidor.
  • Você pode usar ferramentas de terceiros ou código aberto relativamente completas, como a Caixa de Ferramentas do SQL Server Compact e o utilitário de script de esquema e dados do SQL Compact.
  • Você pode escrever e executar seus próprios scripts DDL (linguagem de definição de dados) para manipular o esquema de banco de dados.

Você pode começar com SQL Server Compact e, em seguida, atualizar mais tarde à medida que suas necessidades evoluem. Tutoriais posteriores nesta série mostram como migrar de SQL Server Compact para SQL Server Express e para SQL Server. No entanto, se você estiver criando um novo aplicativo e espera precisar de SQL Server em um futuro próximo, provavelmente é melhor começar com SQL Server ou SQL Server Express.

Configurando o mecanismo de banco de dados SQL Server Compact para implantação

O software necessário para acesso a dados no aplicativo Contoso University foi adicionado instalando os seguintes pacotes NuGet:

Os links apontam para as versões atuais desses pacotes, que podem ser mais recentes do que o que está instalado no projeto inicial que você baixou para este tutorial. Para implantação em um provedor de hospedagem, use o Entity Framework 5.0 ou posterior. Versões anteriores do Migrações do Code First exigem Confiança Total e, em muitos provedores de hospedagem, seu aplicativo será executado em Confiança Média. Para obter mais informações sobre a Confiança Média, consulte o tutorial Implantando no IIS como um ambiente de teste .

A instalação do pacote NuGet geralmente cuida de tudo o que você precisa para implantar esse software com o aplicativo. Em alguns casos, isso envolve tarefas como alterar o arquivo Web.config e adicionar scripts do PowerShell que são executados sempre que você cria a solução. Se você quiser adicionar suporte para qualquer um desses recursos (como SQL Server Compact e Entity Framework) sem usar o NuGet, verifique se você sabe o que a instalação do pacote NuGet faz para que você possa fazer o mesmo trabalho manualmente.

Há uma exceção em que o NuGet não cuida de tudo o que você precisa fazer para garantir a implantação bem-sucedida. O pacote NuGet SqlServerCompact adiciona um script pós-build ao projeto que copia os assemblies nativos para subpastas x86 e amd64 na pasta do compartimento do projeto, mas o script não inclui essas pastas no projeto. Como resultado, a Implantação da Web não os copiará para o site de destino, a menos que você os inclua manualmente no projeto. (Esse comportamento resulta da configuração de implantação padrão; outra opção, que você não usará nesses tutoriais, é alterar a configuração que controla esse comportamento. A configuração que você pode alterar é Somente arquivos necessários para executar o aplicativo em Itens a serem implantados na guia Pacote/Publicar Web da janela Propriedades do Projeto . A alteração dessa configuração geralmente não é recomendada porque pode resultar na implantação de muito mais arquivos no ambiente de produção do que o necessário lá. Para obter mais informações sobre as alternativas, consulte o tutorial Configurando propriedades do projeto .)

Compile o projeto e, em Gerenciador de Soluções clique em Mostrar todos os Arquivos se você ainda não tiver feito isso. Talvez você também precise clicar em Atualizar.

Solution_Explorer_Show_All_Files

Expanda a pasta bin para ver as pastas amd64 e x86 e selecione essas pastas, clique com o botão direito do mouse e selecione Incluir no Projeto.

amd64_and_x86_in_Solution_Explorer.png

Os ícones de pasta são alterados para mostrar que a pasta foi incluída no projeto.

Solution_Explorer_amd64_included.png

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

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 em 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 notas válidos ou nomes de departamento reais.

Para simular esse cenário comum, você configurará um método semente Migrações do Code First que insere no banco de dados apenas os dados que você deseja que estejam lá em produção. Esse método Seed não 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 que os métodos Seed inserissem dados de teste também, pois com cada alteração de modelo durante o desenvolvimento o banco de dados precisava 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, não é necessário incluir dados de teste no método Seed. O projeto baixado usa o método pré-Migrations de incluir todos os dados no método Seed de uma classe de inicializador. Neste tutorial, você desabilitará a classe de inicializador e habilitará as Migrações. Em seguida, você atualizará o método Seed 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 devem ser pré-carregados quando o aplicativo fica ativo.

Como você usará Migrações do Code First, não será mais necessário usar o inicializador DropCreateDatabaseIfModelChanges Code First. O código para esse inicializador está no arquivo SchoolInitializer.cs no projeto ContosoUniversity.DAL. Uma configuração no elemento appSettings do arquivo Web.config faz com que esse inicializador seja executado sempre que o aplicativo tenta 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 arquivo Web.config aplicativo e remova o elemento que especifica a classe de inicializador Code First do elemento appSettings. O elemento appSettings 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.

Em seguida, habilite Migrações do Code First.

A primeira etapa é garantir que o projeto ContosoUniversity esteja 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.

No menu Ferramentas , clique em Gerenciador de Pacotes NuGet e, em seguida, console do Gerenciador de Pacotes.

Selecting_Package_Manager_Console

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".

enable-migrations_command

Esse comando cria um arquivo Configuration.cs em uma nova pasta Migrations no projeto ContosoUniversity.DAL.

Migrations_folder_in_Solution_Explorer

Você selecionou o projeto DAL porque o comando "enable-migrations" 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 para o comando enable-migrations, você pode inserir o comando "get-help enable-migrations".)

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, Instructors = new List<Instructor>() },
    new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1, Instructors = new List<Instructor>() },
    new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1, Instructors = new List<Instructor>() }
};
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();

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;

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

Este exemplo mostrado para este tutorial usa o AddOrUpdate método no 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, e esse método atualiza as linhas que já foram inseridas ou as insere 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.

Pressione CTRL-SHIFT-B para compilar o projeto.

A próxima etapa é criar uma DbMigration classe para a migração inicial. Você deseja que essa migração crie um novo banco de dados, portanto, você precisa excluir o banco de dados que já existe. SQL Server Compact bancos de dados estão contidos em arquivos .sdf na pasta App_Data. Em Gerenciador de Soluções, expanda App_Data no projeto ContosoUniversity para ver os dois bancos de dados SQL Server Compact, que são representados por arquivos .sdf.

Clique com o botão direito do mouse no arquivo School.sdf e clique em Excluir.

sdf_files_in_Solution_Explorer

Na janela Console do Gerenciador de Pacotes , insira o comando "add-migration Initial" para criar a migração inicial e nomeie-a como "Inicial".

add-migration_command

Migrações do Code First cria outro arquivo de classe na pasta Migrações e essa classe contém código que cria o esquema de banco de dados.

No Console do Gerenciador de Pacotes, insira o comando "update-database" para criar o banco de dados e executar o método Seed .

database_command de atualização

(Se você receber um erro que indica que uma tabela já existe e não pode ser criada, provavelmente é porque você executou o aplicativo depois de excluir o banco de dados e antes de update-databaseexecutar . Nesse caso, exclua o arquivo School.sdf novamente e repita o update-database comando.)

Executar o aplicativo. Agora, a página Alunos está vazia, mas a página Instrutores contém instrutores. Isso é o que você obterá em produção depois de implantar o aplicativo.

Empty_Students_page

Instructors_page_after_initial_migration

O projeto agora está pronto para implantar o banco de dados Da escola .

Criando um banco de dados de associação para implantaçã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. Uma de suas páginas é acessível apenas para administradores. Para ver esta página, execute o aplicativo e selecione Atualizar Créditos no menu de submenu em Cursos. O aplicativo exibe a página De entrada , pois somente os administradores estão autorizados a usar a página Atualizar Créditos .

Log_in_page

Faça logon como "administrador" usando a senha "Pas$w0rd" (observe o número zero no lugar da letra "o" em "w0rd"). Depois de fazer logon, a página Atualizar Créditos será exibida.

Update_Credits_page

Quando você implanta um site pela primeira vez, é comum excluir a maioria ou todas as contas de usuário que você cria para teste. Nesse caso, você implantará uma conta de administrador e nenhuma conta de usuário. Em vez de excluir manualmente as contas de teste, você criará um novo banco de dados de associação que tenha apenas uma conta de usuário administrador de que você precisa em produção.

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.

O banco de dados de associação não é mantido por Migrações do Code First e não há nenhum inicializador automático que gere o banco de dados com contas de teste (como há para o banco de dados De estudante). Portanto, para manter os dados de teste disponíveis, você fará uma cópia do banco de dados de teste antes de criar um novo.

Em Gerenciador de Soluções, renomeie o arquivo aspnet.sdf na pasta App_Data para aspnet-Dev.sdf. (Não faça uma cópia, basta renomeá-la – você criará um novo banco de dados em um momento.)

Em Gerenciador de Soluções, verifique se o projeto Web (ContosoUniversity, não ContosoUniversity.DAL) está selecionado. Em seguida, no menu Projeto , selecione ASP.NET Configuração para executar a WAT (Ferramenta de Administração de Site).

Selecione a guia Segurança.

WAT_Security_tab

Clique em Criar ou Gerenciar Funções e adicione uma função de Administrador .

WAT_Create_New_Role

Navegue de volta para a guia Segurança , clique em Criar Usuário e adicione o usuário "administrador" como administrador. Antes de clicar no botão Criar Usuário na página Criar Usuário, selecione a caixa Administrador marcar. A senha usada neste tutorial é "Pas$w0rd" e você pode inserir qualquer endereço de email.

WAT_Create_User

Feche o navegador. Em Gerenciador de Soluções, clique no botão atualizar para ver o novo arquivo aspnet.sdf.

New_aspnet.sdf_in_Solution_Explorer

Clique com o botão direito do mouse em aspnet.sdf e selecione Incluir no Projeto.

Distinguindo o desenvolvimento de bancos de dados de produção

Nesta seção, você renomeará os bancos de dados para que as versões de desenvolvimento sejam School-Dev.sdf e aspnet-Dev.sdf e as versões de produção sejam School-Prod.sdf e aspnet-Prod.sdf. Isso não é necessário, mas isso ajudará a impedir que você tenha versões de teste e produção dos bancos de dados confusos.

Em Gerenciador de Soluções, clique em Atualizar e expanda a pasta App_Data para ver o banco de dados Da escola que você criou anteriormente; clique com o botão direito do mouse nele e selecione Incluir no projeto.

Including_School.sdf_in_project

Renomeie aspnet.sdf para aspnet-Prod.sdf.

Renomeie School.sdf para School-Dev.sdf.

Ao executar o aplicativo no Visual Studio, você não deseja usar as versões -Prod dos arquivos de banco de dados, você deseja usar versões -Dev . Portanto, você precisa alterar as cadeias de conexão no arquivo Web.config para que elas apontem para as versões -Dev dos bancos de dados. (Você não criou um arquivo School-Prod.sdf, mas tudo bem porque o Code First criará esse banco de dados em produção na primeira vez que você executar seu aplicativo lá.)

Abra o arquivo de Web.config do aplicativo e localize as cadeias de conexão:

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

Altere "aspnet.sdf" para "aspnet-Dev.sdf" e altere "School.sdf" para "School-Dev.sdf":

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

O mecanismo de banco de dados SQL Server Compact e ambos os bancos de dados agora estão prontos para serem implantados. No tutorial a seguir, você configura transformações automáticas de arquivoWeb.config para configurações que devem ser diferentes nos ambientes de desenvolvimento, teste e produção. (Entre as configurações que devem ser alteradas estão as cadeias de conexão, mas você configurará essas alterações posteriormente ao criar um perfil de publicação.)

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 especialmente Criando e publicando um pacote e transformações de arquivo de configuração e código-fonte.