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