ASP .NET - Iniciando com ASP .NET Core MVC e EF Core  - IX

 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:

  • Na janela Solution Explorer clique com o botão direito do mouse sobre o projeto e escolha a opção Open in File Explorer a partir do menu:
  • Digite o comando cmd na barra de endereços e tecle ENTER;
  • A janela de prompt de comandos será aberta na pasta do projeto conforme mostra a figura a seguir:

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:


José Carlos Macoratti