Neste artigo eu vamos iniciar a criação de uma aplicação ASP .NET Core MVC usando o Entity Framework Core no Visual Studio. |
Estamos criando uma aplicação Web usando ASP.NET Core MVC com Entity Framework Core e Visual Studio.
|
No artigo anterior ajustamos a view About para exibir estatísticas dos estudantes. Vamos agora tratar de possíveis alterações no modelo usando Migrations.
1 - Introdução ao Migrations
Quando você
desenvolve um novo aplicativo, seu modelo de dados muda freqüentemente e cada
vez que o modelo muda, ele fica fora de sincronia com o banco de dados.
Começamos esta séria de artigos configurando o Entity Framework para criar o
banco de dados se ele não existir. Assim, cada vez que você alterar o modelo de
dados - adicionar, remover ou alterar classes de entidade ou alterar sua
classe DbContext - você pode excluir o banco de dados e o EF vai criar um
novo banco que corresponde ao modelo e vai preencher o banco 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 na produção. Quando o aplicativo
está sendo executado em produção, ele normalmente armazena os dados que deseja
manter e não quer perder tudo a cada vez que fizer uma alteração, como adicionar
uma nova coluna.
O recurso EF Core Migrations resolve esse problema, permitindo ao EF
atualizar o esquema de banco de dados em vez de criar um novo banco de dados.
Para trabalhar com Migrations, podemos usar :
1 - Console do Gerenciador de Pacotes
(Package Manager Console)
2- A
interface de linha de comando (CLI).
Neste artigo vou usar o comandos da CLI e as ferramentas do EF para a CLI são fornecidas no pacote Microsoft.EntityFrameworkCore.Tools.DotNet.
Precisamos então instalar esse pacote em nosso projeto e para fazer isso podemos abrir o arquivo de projeto UniversidadeMacoratti.csproj e adicionar o pacote à coleção DotNetCliToolReference conforme mostrado abaixo:
... <ItemGroup> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" /> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.1" /> </ItemGroup> ... |
A seguir vamos alterar também no arquivo appsettings.json o nome do banco de dados na string de conexão para UniversisadeMacoratti2:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=UniversidadeMacoratti2;
Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
}
|
Esta alteração define o projeto de forma que a primeira migração irá criar um novo banco de dados.
2 - Criando a Migração Inicial
Salve todas as alterações feitas e dê um Build no projeto.
A seguir abra um janela de comandos do windows e navegue para a pasta do projeto da seguinte forma:
Digite o seguinte comando : dotnet ef migrations add InitialCreate
Ao final do processo você deverá ver a mensagem abaixo:
Nota: Se houver alguma mensagem de erro verifique se o banco de dados não esta em uso.
3 - Examinando os métodos Up e Down
Quando você executou o comando
add migrations, o EF
gerou o código que criará o
banco de dados a partir do zero.
Esse código está na pasta
Migrations, no arquivo
chamado _InitialCreate.cs.
O método Up da classe
InitialCreate cria as
tabelas do banco de dados que
correspondem aos conjuntos de
entidades do modelo de dados e o
método Down as exclui,
conforme podemos ver abaixo:
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using System;
namespace UniversidadeMacoratti.Migrations
{
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Curso",
columns: table => new
{
CursoID = table.Column<int>(nullable: false),
Creditos = table.Column<int>(nullable: false),
Titulo = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Curso", x => x.CursoID);
});
....
....
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Matricula");
migrationBuilder.DropTable(
name: "Curso");
migrationBuilder.DropTable(
name: "Estudante");
}
}
}
|
O Migrations chama o método Up para implementar as alterações no modelo de dados para a migração. Se você emitir o comando para desfazer a alteração o método Down será chamado.
Este código é para a
migração inicial que foi criada quando você inseriu o
comando - migrations add InitialCreate.
O parâmetro de nome de migração ("InitialCreate")
é usado para o nome do arquivo e pode ser qualquer nome.
É melhor escolher uma palavra ou frase que resume o que
está sendo feito na migração.
Se você criou a migração inicial quando o banco de dados
já existia, o código de criação do banco de dados é
gerado, mas não precisará ser executado porque o banco
de dados já corresponde ao modelo de dados.
Quando você implanta o aplicativo em outro ambiente onde
o banco de dados ainda não existe, esse código será
executado para criar seu banco de dados, por isso é uma
boa idéia testá-lo primeiro. É por isso que você alterou
o nome do banco de dados na string de conexão - para que
as migrações possam criar um novo banco a partir do
zero.
4 - Examinando o data model snapshot
O Migrations também cria um instantâneo (snapshot) do schema atual do banco de dados no arquivo EscolaContextoModelSnapshot.cs cujo código vemos a seguir:
Como o esquema do banco
de dados atual é representado no código, o EF Core não
precisa interagir com o banco de dados para criar
migrações.
Quando você adiciona uma migração, o EF determina o que
mudou comparando o modelo de dados com o arquivo de
instantâneo. O EF interage com o banco de dados somente
quando ele tem que atualizar o banco de dados.
O arquivo de snapshot (instantâneo) deve ser
mantido em sincronia com as migrações que o criam,
portanto, não é possível remover uma migração apenas
excluindo o arquivo denominado _.cs. Se você
excluir esse arquivo, as migrações restantes ficarão
fora de sincronia com o arquivo de instantâneo do banco
de dados.
Para excluir a última migração que você adicionou, use o comando : dotnet ef migrations remove.
5 - Aplicando a migração ao banco de dados
Para aplicar a migração, e, assim criar o banco de dados e as tabelas, digite o seguinte comando na janela de comandos : dotnet ef database update
Após o processamento você verá as mensagens:
Após isso podemos inspecionar o banco de dados usando o SQL Server Object Explorer no menu View.
Você notará a adição de uma nova tabela __EFMigrationsHistory que mantém um registro de quais migrações foram aplicadas ao banco de dados.
Visualize os dados nessa tabela e você verá uma entrada para a primeira migração.
Agora execute novamente a aplicação para verificar se tudo esta funcionando como anteriormente:
A ferramenta Entity
Framework usada para gerenciar migrações está disponível
a partir da .NET Core CLI ou na janela do Console
do Gerenciador de Pacotes do Visual Studio (PMC).
No artigo mostramos o uso da CLI, mas você pode usar o
PMC se preferir.
Se você quiser usar os comandos do PMC, basta instalar o
pacote Microsoft.EntityFrameworkCore.Tools usando
o comando :
Install-Package Microsoft.EntityFrameworkCore.Tools
-Version 1.1.1
Ao contrário das ferramentas CLI, você não precisa editar o arquivo .csproj.
Note que este não é o mesmo pacote que você instalou usando CLI: seu nome termina em Tools, ao contrário do nome do pacote CLI que termina em Tools.DotNet.
No próximo artigo vamos ver como criar um modelo de dados mais complexo.
E agora, filhinhos, permanecei nele(Jesus); para que, quando ele se manifestar, tenhamos confiança, e não sejamos confundidos por ele na sua vinda. 1 João 2:28
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Entity Framework - Conceitos Básicos - Uma visão geral - Macoratti
Entity Framework - Separando as classes das entidades do ... - Macoratti
Entity Framework 6 - Aplicação em camadas - Definindo o ... - Macoratti
C# - Cadastro de Clientes com Entity Framework em ... - Macoratti
NET - Entity Framework 5 - Operações CRUD (revisitado) - Macoratti