EF Core - Apresentando e usando o Migrations - II


Hoje vamos continuar a série de artigos que apresenta o Migrations e seus principais recursos.

Atualmente (junho/2020) a versão estável do EF Core é a versão 3.1.4, mas já temos as versões preview do EF core 5.0.0 conforme você pode conferir aqui.

No artigo anterior explicamos como criar e aplicar migrações usando os EF Core e aprendemos também qual a finalidade dos métodos Up() e Down() nos arquivos de migração que herdam de Migration.

Ocorre que todo o código destes métodos são gerados pelo EF Core.

Será que podemos alterar o código gerado e incluir também nosso código personalizado ?

É claro que podemos.

Podemos usar o parâmetro MigrationBuilder para acessar a ampla variedade de métodos que podem nos ajudar no processo de inclur um código personalizado. Um desses métodos é o método Sql que podemos usar para adicionar o código personalizado que precisamos.

Então, para mostrar isso, vamos criar uma nova migração para poder incluir uma nova coluna Sexo na tabela Alunos.

Para isso vamos primeiro alterar o código da classe Aluno incluindo a propriedade Sexo tipo string:

   using System;

   public class Aluno
    {
        public Guid Id { get; set; }

        [Required(ErrorMessage ="Informe o nome do aluno")]
        [MaxLength(80, ErrorMessage = "O nome deve ter no máximo 80 caracteres")]
        public string Nome { get; set; }

        public int? Idade { get; set; }
        public bool Ativo { get; set; }

        [MaxLength(10, ErrorMessage = "Informe o Sexo com no máximo 10 caracteres")]
        public string Sexo { get; set; }
    }

Nota: Veja o projeto criado aqui.

A seguir vamos gerar uma migração usando o comando:

add-migration AjusteTabelaAlunos

A seguir  vamos abrir o arquivo  20200610144144_AjusteColunaNome.cs que foi gerado e incluir o código destacado em azul onde estamos criando um procedimento armazenado para retornar todos os alunos com idade maior que um parâmetro que deverá ser passado:

using Microsoft.EntityFrameworkCore.Migrations;
namespace AspNet_EFCoreApi.Migrations
{
    public partial class AjusteTabelaAlunos : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<string>(
                name: "Sexo",
                table: "Alunos",
                maxLength: 10,
                nullable: true);
               migrationBuilder.Sql(@"CREATE PROCEDURE MacProcedure @idade as int
                                             AS
                                             SELECT * FROM Alunos Where Idade > @idade");
        }
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "Sexo",
                table: "Alunos");
           migrationBuilder.Sql(@"DROP PROCEDURE MacProcedure"); 
        }
    }
}

Note que no método Down() temos que incluir o código para remover a stored procedure macProcedure criada.

A seguir aplicando a migração com : update-database

Podemos examinar a estrutura da tabela Alunos no SQL Server Management Studio ou no Server Explorer no VS 2019.

Usando o Server Explorer vemos abaixo a coluna Sexo criada:

Também podemos visualizar a stored procedure MacProcedure que foi criada no banco de dados:

Vimos assim que podemos incluir um código personalizado no script de migração.

Na próxima parte do artigo veremos como criar a migração se os arquivos das entidades e do contexto estiverem em um projeto separado.

Pegue o projeto aqui :   AlunosWeb.zip (sem as referências)

"Visto como na sabedoria de Deus o mundo não conheceu a Deus pela sua sabedoria, aprouve a Deus salvar os crentes pela loucura da pregação.
Porque os judeus pedem sinal, e os gregos buscam sabedoria;
Mas nós pregamos a Cristo crucificado, que é escândalo para os judeus, e loucura para os gregos."
1 Coríntios 1:21-23

Referências:


José Carlos Macoratti