ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VIII

 Neste artigo eu vou mostrar como criar uma aplicação ASP .NET Core MVC usando o VS 2017.

Continuando a sétima parte do artigo vamos usar o Entity Framework Code First Migrations para adicionar um novo campo ao modelo e migrar essa alteração para o banco de dados.

Quando você usa o EF Code First para criar automaticamente um banco de dados, o Code First adiciona uma tabela ao banco de dados para ajudar a rastrear se o esquema do banco de dados está em sincronia com as classes do modelo de onde ele foi gerado.

Se eles não estiverem sincronizados, o EF lançará uma exceção. Isso torna mais fácil encontrar problemas inconsistentes de banco de dados.

Adiciona a propriedade Classificacao ao Model Filme

Abra o arquivo Filme.cs na pasta Moldel e inclua a propriedade Classificacao conforme mostrado o código :

    public class Filme
    {
        public int ID { get; set; }
        public string Titulo { get; set; }
        [Display(Name = "Data de Lançamento")]
        [DataType(DataType.Date)]
        public DateTime Lancamento { get; set; }
        [Display(Name = "Gênero")]
        public string Genero { get; set; }
        [Display(Name = "Preço")]
        public decimal Preco { get; set; }
        public string Classificacao { get; set; }
    }

Dê um Build (CTRL+SHIFT+B) na Solution.

Como adicionamos um novo campo à classe Filme, vamos ter que atualizar a lista de vinculação para que esta nova propriedade seja incluída.

Abra o controlador FilmesController.cs, e atualize o atributo [Bind] para os métodos de Action Create e Edit incluindo a propriedade Classificacao:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("ID,Titulo,Lancamento,Genero,Preco,Classificacao")] Filme filme)
        ....
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, [Bind("ID,Titulo,Lancamento,Genero,Preco,Classificacao")] Filme filme)
        ....

Precisamos também atualizar a respectivas Views a fim de exibir, criar e editar a nova propriedade Classificacao.

Abra o arquivo /Views/Filmes/Index.cshtml e inclua o campo Classificacao :

     .....      
        </th>
                <th>
                    @Html.DisplayNameFor(model => model.filmes[0].Classificacao)
                </th>
            <th></th>
        </tr>
      </thead>
     <tbody>
    @foreach (var item in Model.filmes) {
        <tr>
             ....
            <td>
                @Html.DisplayFor(modelItem => item.Preco)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Classificacao)
            </td>
      ....

A seguir atualize o arquivo /Views/Filmes/Create.cshtml com um campo Classificacao. Você pode copiar e colar o "form group" anterior e deixar o intelliSense ajudá-lo a atualizar os campos. IntelliSense funciona com Tag Helpers.

 ...
<form asp-action="Create">
    <div class="form-horizontal">
        <h4>Filme</h4>
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Titulo" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Titulo" class="form-control" />
                <span asp-validation-for="Titulo" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Classificacao" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Titulo" class="form-control" />
                <span asp-validation-for="Classificacao" class="text-danger"></span>
            </div>
        </div>
...

Após realizar esas alterações a aplicação não vai funcionar até que atualizemos o banco de dados para incluir o novo campo.

Se você executar a aplicação vai receber a seguinte mensagem de erro :  SqlException: Nome de coluna inválido 'Classificacao'.

Você está vendo esse erro porque a classe de modelo Filme atualizada é diferente do esquema da tabela Filmes do banco de dados existente. (Não existe ainda a coluna Classificacao na tabela do banco de dados.)

Existem algumas abordagens para resolver o erro:

- Fazer com que o Entity Framework automaticamente elimine e recrie o banco de dados com base no esquema da classe do novo modelo. Esta abordagem é muito conveniente no início do ciclo de desenvolvimento quando você está fazendo desenvolvimento ativo em um banco de dados de teste; Ele permite que você evolua rapidamente o modelo e o esquema de banco de dados juntos. A desvantagem, porém, é que você perde os dados existentes no banco de dados - então você não quer usar essa abordagem em um banco de dados de produção! Usar um inicializador para preencher automaticamente um banco de dados com dados de teste é muitas vezes uma maneira produtiva de desenvolver um aplicativo.

- Modificar explicitamente o esquema do banco de dados existente para que ele corresponda às classes de modelo. A vantagem dessa abordagem é que você mantém seus dados. Você pode fazer essa alteração manualmente ou criando um script de alteração de banco de dados.

- Usar o Code First Migrations para atualizar o esquema do banco de dados.

Neste artigo vamos usar a opção - Code First Migrations.

Usando o Code First Migrations para atualizar o banco de dados

Vamos atualizar a classe SeedData para que ela forneça um valor para a nova coluna Classificacao.

Nota:

Classificação de filmes no Brasil:
L (verde) – Livre para todos os públicos.
10(azul)– Não recomendado para menores de 10 anos.
12(amarelo)– Não recomendado para menores de 12 anos.
14(laranja) – Não recomendado para menores de 14 anos.
16 (vermelho) – Não recomendado para menores de 16 anos. Por poder conter nudez parcial ou violência.
18(preto) – Não recomendado para menores de 18 anos. Contém conteúdo explícito apropriado somente para adultos.

A classificação indicativa vigente nos Estados Unidos adota a seguinte classificação:

G – O filme não contém nada que os pais se ofenderiam caso assistissem com seus filhos.
PG – Os pais devem verificar o que se passa no filme, pois pode conter conteúdo não apropriado para os filhos mais novos.
PG13 – Os pais devem ficar atentos porque o filme pode conter conteúdo não apropriado para pré-adolescentes.
R – O filme contém algum tipo de conteúdo adulto. Os pais devem certificar-se sobre o filme antes de permitir que seus filhos adolescentes assistam.
NC-17– Conteúdo apropriado somente para adultos. Não permitido para jovens ou crianças.

Uma alteração de exemplo é mostrada abaixo, mas você precisará fazer essa alteração para cada novo filme:

    .....
   context.Filme.AddRange(
                     new Filme
                     {
                         Titulo = "A Bela e a Fera",
                         Classificacao="L",
                         Lancamento = DateTime.Parse("2017-3-16"),
                         Genero = "Fantasia/Romance",
                         Preco = 7.99M
                     },
....

Após incluir a classificação em todos os filmes na classe SeeData dê um Build na solução e abra uma janela de prompt de comandos e posicione-se na pasta do projeto da sua aplicação.

Nota: Para saber a localização da pasta do projeto clique com o botão direito sobre o projeto e a seguir clique em Open Folder in File Explorer.

A seguir digite o seguinte comando no prompt de comando: dotnet ef migrations add Classificacao

Ao final da execução você verá a mensagem:

A seguir digite o comando : dotnet ef database update

Se você receber a mensagem de erro : No executable found matching command "dotnet-ef":

- Verifique se você está na pasta do projeto (que contém o arquivo .csproj).
- Verifique se o arquivo .csproj contém o pacote "Microsoft.EntityFrameworkCore.Tools.DotNet" NuGet.


O comando migrations add diz à estrutura de migração para examinar o Model Filme atual com o esquema atual do banco de dados Filmes e criar o código necessário para migrar o BD para o novo modelo.

O nome "Classificacao" é arbitrário e é usado para nomear o arquivo de migração. É útil usar um nome significativo para a etapa de migração.

Se você excluir todos os registros no Banco de dados , o inicializador vai preencher novamente o Banco e vai incluir o campo Classificacao.

Podemos verificar a estrutura do banco de dados acionando o menu View -> SQL Server Object Explorer



Execute a aplicação e verifique se você pode criar, editar e exibir filmes com o campo Classificacao.

Nota: Você também deve adicionar o campo Classificacao nas views Edit.cshtml, Details.cshtml e Delete.cshtml.

Na próxima parte do artigo vamos tratar da lógica de validação do Model Filme em nossa aplicação.

Pegue o projeto funcionando até aqui neste link:  MvcFilme8.zip

(Disse Jesus) - 'Aquele que tem os meus mandamentos e os guarda esse é o que me ama; e aquele que me ama será amado de meu Pai, e eu o amarei, e me manifestarei a ele.'
João 14:21

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 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti