Escolha uma Página
Adicionando um modelo (model) a um aplicativo ASP.NET Core MVC com o Visual Studio 2017

Adicionando um modelo (model) a um aplicativo ASP.NET Core MVC com o Visual Studio 2017

Models

Neste artigo veremos a parte M, “Modelo”, do aplicativo MVC. O exemplos mostrará como gerenciar filmes em um banco de dados.

Criando Modelos (Models)

Esta é a parte mais complexa do modelo MVC. Ao menos para quem está iniciando. É que os modelos são classes que utilizam o chamado Entity Framework Core (EF Core) para se conectar “fisicamente” com o banco de dados (database). O EF Core é que literalmente acessa as bases de dados. O EF Core é uma estrutura de mapeamento objeto-relacional (ORM – object-relational mapping) que simplifica o código de acesso a dados que você precisa escrever. O EF Core suporta muitos mecanismos de banco de dados. Mas note, são bancos de dados relacionais (como MS SQL, MYSQL e outros SQLs – Structured Query Languages). Não tem nada a ver com NoSQL, Voldemort, MongoDB, Tokyo Tyrant e CouchDB, que são bancos de dados não-relacionais).

Se você gosta de aprender escrevendo código, a Microsoft recomenda um de seus guias de Introdução para que você comece a aprender bem o que é o EF Core (prepare-se, são 101 artigos em inglês!).

Muito bem, os modelos que criamos na verdade são classes. Eles apenas definem as propriedades dos dados que serão armazenados no banco de dados. As classes que escrevemos são nossos modelo, também conhecidos como modelos POCO, que usam – no caso do Core MVC – o Entity Framework Core para fazer 3 grandes trabalhos:

  • Você pode não ter banco de dados algum e resolve escrever todas as classes do seu modelo de negócio primeiro. A partir dessa classe, em puro texto, o EF Core ajuda a construir o database, tabela por tabela, índice por índice, sem que você tenha de fazer isso…
  • Você já tem o database prontinho antes de começar a escrever sua aplicação (populado ou não com dados). O EF Core consegue ler essas tabelas e escrever para nós todas as classes POCO… Ou seja, gera todos os modelos a partir do database.
  • Se, durante o desenvolvimento da sua aplicação você for alterando as classes (acrescentado, eliminando ou alterando campos de suas tabelas relacionais, ou criando novas relações, o EF Core permite manter a integridade entre suas classes alteradas e o banco de dados físico. Ou seja, o database é sempre um espelho das suas classes dentro da aplicação.

Parece um pouco mágico, mas é isso mesmo. Quem odeia banco de dados, começa pelas classes. É o jeito chamado “Classes Primeiro” (classes first). Quem gosta de banco de dados, em geral começa pelo database e depois o acopla à aplicação (“Database First“).

Neste tutorial escreveremos primeiro as classes do modelo e o EF Core criará o banco de dados para nós. ASP.NET Core – Banco de Dados Existente.

 

Adicionando uma classe de modelo de dados

Nota: Os modelos ASP.NET Core 2.0 já implementam a pasta Models (Modelos). No Solution Explorer, clique com o botão direito do mouse no projeto MvcMovie> Add > New Folder. Nomeie a nova pasta  como Models.

Clique com o botão direito na pasta Models. Escolha > Add > Class. Nomeie a classe como Movie e adicione as seguintes propriedades:

 

O campo ID é requerido pelo banco de dados para a chave primária. Sempre que você usa ID, o EF Core interpreta que esse campo é chave e você não se preocupa em definir isso.

DICA: se você quando estiver modelando for usar uma chave com um nome diferente de ID, você pode forçar a barra e definir que o campo é chave, colocando, antes de sua linha, a expressão [Key] (sim, entre colchetes e com K maiúsculo. Nesse caso, é preciso incluir using System.ComponentModel.DataAnnotations;. Se você esquecer, o Visual Studio vai lhe sugerir rapidinho. Veja como ficaria:

DICA: Note que todos os nomes de campos começam com letra maiúscula. Essa é uma convenção no Core MVC. Acostume-se a seguir essa convenção e você evitará avisos de “warning” (alerta) quando compilar a aplicação…

DICA 2: Sempre que criar ou alterar qualquer modelo. logo em seguida clique em Build > Solution ou em Build > NomeDoSeuProjeto. Primeiro, isso ajuda a verificar se o projeto está sem erros. Segundo, será impossível continuar e gerar o banco de dados sem fazer o Build primeiro (muita gente se atrapalha com isso).

DICA 3: É possível (além do menu te topo), ir na janela do Solution Explorer, clicar com o botão direito no Nome do Projeto e escolher o opção Build.

Pronto. Temos nosso primeiro Modelo da nossa aplicação MVC;

clique com o botão direito do mouse na pasta Controladores> Adicionar> Controlador.

Scaffolding um Controlador (ou seja, gerando um arquivo tipo controler)

Não tenho uma palavra para Scaffolding ´então prefiro deixar a palavra em inglês mesmo. O Scaffold faz uma varredura no arquivo da classe de um modelo que você escolhe e permite gerar o arquivo controlador (controller).

Depois que você fez o Build assim que definiu o modelo, no próprio Solution Explorer clique no folder Controllers (que normalmente é instalado pelo template do Visual Studio), clique com o botão direito do mouse e escolha Add > Controller (esqueça outras opções por enquanto).

Na janela que vai aparecer, (Add MVC Dependencies), selecione Minimal Dependencies e clique em Add.

Quando você implementa os modelos, o Visual Studio precisa que você adiciona as dependências necessárias para implementar um controlador (que são necessárias para o Scaffold). Senão o controlador não é criado, digamos, “automaticamente”.

Por isso é preciso a clicar na pasta de controladores (Controllers) e escolher Add > Controller.

No nosso caso, depois de definir Minimal Dependencies, como estamos iniciando a solução, o Visual Studio implementa as dependências na primeira vez que você pede para adicionar um controlador.

A mancada é que é preciso pedir de novo, pois agora ele tem as dependências e não vai mostrar a janelinha de Add MVC Dependencias.

Volte para o Solution Explorer, clique na pasta Controllers e com o botão direito do mouse escolha Add > Controller.

Na janela Add Scaffold, escolha a opção MVC Controller with Views, using Entity Framework e depois clique em Add.

DICA: Tem muita gente que se perde e não acha o tal Add… De fato o Add desaparece se você está “debugando” a aplicação. Saia do modo debug e tudo aparece novamente… O Visual Studio é bem espertinho e nas versões mais recentes não permite nem que você edite a página aberta de um arquivo Model ou de um arquivo Controller. A única coisa em que pode editar durante o debug são páginas de Views, pois aí não é necessário recompilar e você pode ver de imediato no navegador as alterações nas páginas .cshtml simplesmente dando um refresh (F5 ou CTRL+F5) no navegador. Nas páginas com .cs, nem sonhar editar em modo debug.

Aparecendo a janela Add Controller:

  • Model Class (classe do modelo): defina Movie no select (MvcMovie.Models)
  • Data context class: selecione o ícone de + e adicione o default (padrão) MvcMovie.Models.MvcMovieContext

  • Views: fique com o default (padrão) de cada opção selecionada
  • Controller name: dique com o default (padrão) MoviesController
  • Clique em Add.

O Visual Studio cria:

  • Uma classe de contexto do banco de dados Entity Framework Core (Data/MvcMovieContext.cs)
  • Um controlador para Movies (Controllers/MoviesController.cs)
  • As páginas de visualização (Views Razor)  para Create, Edit,Delete, Detais e Index (Criar, Excluir, Detalhes, Editar e Índice). Esses arquivos podem ser visualizados no Diretório Views na pasta MOvies (que também foi criado pelo Scafold): View/Movies/*.cshtml.

O processo de scaffolding também gerou o arquivo controlador (controller) e, dentro dele, todas as ações (Actions) para fazer o chamado CRUD (create, read, update, e delete). Aliás, o CRUD do Visual Studio é mais “amplo”, pois inclui a página índice (Index) e um método simples para testar se existe ou não algum dado no banco de dados na tabela referente a esse modelo que originou o controlador (controller).

Em breve teremos uma aplicação web totalmente funcional que permite gerenciar uma base de dados de filmes. Nesse momento, se você executar o aplicativo e clicar no link MvcMovie, você receberá um erro semelhante ao seguinte:

É que  começamos este projeto no modo “odigo primeiro, banco de dados depois”. Ainda não existe, fisicamente, o database.

Para gerarmos o database, usaremos um recurso poderoso do EF Core, chamado Migrations.

Migrations, entre outras coisas, permite que você crie um banco de dados que corresponda ao seu modelo de dados. E que também atualize o esquema do banco de dados sempre que seu modelo de dados mudar. Ou seja, ao alterar uma classe de um modelo existente ou ao acrescentar uma nova classe, você roda o Migrations (Migrações) e literalmente ele migra as mudanças para o banco de dados (database). Essa sincronização que é feita pelo Migrations permite espelhar todas as mudanças que você efetivar, mantendo a integridade entre  a aplicação e a base de dados. Inclusive se você fizer uma mudança que não deveria ter feito, é possível migrar para trás, ou seja, voltar a qualquer estado anterior… É poderoso.

DICA: Se você for curioso, vai ver que além de criar a pasta Data/Migrations dentro da sua aplicação, onde cada migração é guardada, a ferramenta Migrations também cria uma tabela Migrations no seu banco de dados, onde armazena dados e horários de todas as migrações realizadas.

Adicionando ferramentas de EF e executando a migração inicial

Pode ser que você já tenha instalado as ferramentas de EF Core na instalação do Visual Studio 2017. Mas não custa nada verificar.

Nesta seção, você usará o Package Manager Console (PMc – Console do Gerenciador de Pacotes) para:

  • Adicionar o