![]()  | 
    
     Neste artigo vamos iniciar a criação de controllers e views em uma aplicação ASP .NET Core MVC usando o Entity Framework Core no Visual Studio.  | 
  
Continuando a segunda parte do artigo vamos definir um controlador MVC em nosso projeto e as respectivas Views que usarão o EF para consultar e persistir dados.
Criando um Controller e Views
A criação automática dos métodos Actions para realizar o CRUD e as Views é conhecida como Scaffolding. O Scaffolding irá criar automaticamente os métodos Action e as Views, e, quando você precisar personalizar o código gerado, você pode usar classes parciais ou você regenera o código quando as houver alterações.
Vamos iniciar criando um controlador em nosso projeto. Clique com o botão direito do mouse sobre a pasta Controllers, e a seguir clique em Add -> Controller;
Na janela Add MVC Dependencies selecione a opção - Minimal Dependencies e clique no botão Add;

O VS 2017 vai adicionar as dependências necessárias para montar o controller.
Após isso repita o procedimento e clique com o botão direito do mouse sobre a pasta Controllers, e a seguir clique em Add -> Controller;
Na janela Add Scaffold selecione a opção : MVC Controller with views, using Entity Framework :

Clique no botão Add.
Agora na janela Add Controller vamos fazer as seguintes definições :
Model Class : Selecione Estudante(UniversidadeMacoratti.Models)
Data context class : clique no botão + e selecione EscolaContexto(UniversidadeMacoratti.Data) e clique no botão Add;
						
						
Ao clicar no botão Add, o mecanismo de Scaffolding do Visual Studio irá criar um arquivo EstudantesController.cs, na pasta Controllers, e um conjunto de Views (arquivos .cshtml), na pasta /Views/Estudantes, que funcionam com o controlador.
A figura abaixo mostra o resultado:
						
						
						
						Note que o controlador toma o nosso contexto, 
						EscolaContexto, como um parâmetro de construtor.
A injeção de dependência do contâiner ASP .NET Core vai cuidar de passar uma instância de EscolaContexto para o controlador porque isso foi configurado no arquivo Startup.cs, lembra... ?
O controlador contém um método Action Index que exibe todos os estudantes existentes no banco de dados, ele obtém uma lista de estudantes do conjunto de entidades Estudantes lendo a propriedade Estudantes da instância do contexto do banco de dados.
								        // GET: Estudantes
        public async Task<IActionResult> Index()
        {
            return View(await _context.Estudantes.ToListAsync());
        }
								 | 
							
Note que é retornado uma View, a view Index.cshtml, que exibe uma lista de estudantes em uma tabela: (Eu já traduzi os textos)
								@model IEnumerable<UniversidadeMacoratti.Models.Estudante>
								@{
    ViewData["Title"] = "Index";
}
<h2>Index</h2>
<p>
    <a asp-action="Create">Criar Novo</a>
</p>
<table class="table">
    <thead>
        <tr>
                <th>
                    @Html.DisplayNameFor(model => model.SobreNome)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Nome)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.DataMatricula)
                </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.SobreNome)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Nome)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DataMatricula)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.EstudanteID">Editar</a> |
                <a asp-action="Details" asp-route-id="@item.EstudanteID">Detalhes</a> |
                <a asp-action="Delete" asp-route-id="@item.EstudanteID">Deletar</a>
            </td>
        </tr>
         }
    </tbody>
</table>
								 | 
							
Pressione F5 ou CTRL + F5 para executar o projeto e a seguir clique na guia Estudantes para ver os dados de teste que definimos no método DbInitializer.Initialize.
Dependendo do tamanho da janela do seu navegador, você verá o link da guia Estudante na parte superior da página ou você terá que clicar no ícone de navegação no canto superior direito para ver o link.
						
						
Vamos agora dar uma espiada no banco de dados e nas tabelas.
Espiando o banco de dados e as tabelas
Quando você iniciar a aplicação, o método DbInitializer.Initialize chama o método EnsureCreated, e, o EF percebe que não existe um banco de dados e então ele cria um, e, a seguir, as tabelas são preenchidas com os dados de testes definido no código do método Initialize.
Vamos verificar o banco de dados e as tabelas criados usando o SQL Server Object Explorer (SSOX). Feche o navegador e pare a aplicação.
No menu View clique em SQL Server Object Explorer;
A seguir clique no item (localdb)\MSSQLLocalDB(SQL Server 13.0.1601)...;
Depois clique no banco de dados UniversidadeMacoratti1 e expanda o nó Table para visualizar as tabelas do banco de dados:
						
						
Clique com o botão direito do mouse sobre a tabela Estudante e a seguir em View Data para visualizar as colunas que foram criadas e as linhas que foram inseridas na tabela:
						
						
O banco de dados .mdf e o arquivo .ldf estão presentes na pasta c:\Users\user
								
								![]()  | 
							
Podemos alterar a estrutura da classe Estudante , incluindo uma nova coluna Email, por exemplo, e, ao executar novamente a aplicação, o método EnsureCreated executado no início, irá recriar toda a estrutura dos dados agora incluindo a nova coluna.
O Entity Framework por padrão adota algumas convenções (Conventions) que ele usa para realizar algumas operações.
Mas o que vem a ser essas convenções ???
Em nosso contexto, podemos dizer que uma convenção é uma regra padrão pelo qual não teremos que fazer algumas configurações de mapeamento para nossas entidades, sendo que o EF vai , baseado nessas convenções, realizar as tarefas de forma automática.
Vejamos algumas delas:
Os nomes das propriedades DbSet são usadas para dar nomes às tabelas. Para entidades não referenciadas por uma propriedade DbSet, nomes de classe de entidade são usados como nomes de tabelas;
Os nomes das propriedades da entidade são usados para dar nomes às colunas;
As propriedades de entidade que são nomeadas como ID ou classnameID são reconhecidas como propriedades de chave primária;
O comportamento convencional pode ser substituído. Por exemplo, você pode especificar explicitamente nomes de tabela, e, você pode definir nomes de colunas e definir qualquer propriedade como chave primária ou chave estrangeira, como você veremos mais adiante.
Se você espiou o código gerado quando da criação do controlador EstudantesController notou que foi gerado código assíncrono. A programação assíncrona é o padrão na ASP .NET Core e no EF Core.
public async Task<IActionResult> Index()
{
    return View(await _context.Students.ToListAsync());
}
						
						Ao escrever código 
						assíncrono na utilização do Entity Framework fique 
						atento ao seguinte:
						
						- Somente as instruções que fazem 
						com que consultas ou comandos sejam enviados para o 
						banco de dados são executados de forma assíncrona. Isso 
						inclui, por exemplo, ToListAsync, 
						SingleOrDefaultAsync e SaveChangesAsync. Isso não 
						inclui instruções que apenas alteram um IQueryable, 
						como por exemplo: var estudantes = context.Estudantes.Where (s => 
						s.SobreNome == "Macoratti").
						
						- Um contexto EF não é thread-safe: não tente fazer 
						várias operações em paralelo. Quando você chama qualquer 
						método EF assíncrono, use sempre a palavra-chave 
						await.
						
						- Se você quiser tirar proveito dos benefícios de 
						desempenho do código assíncrono, certifique-se de que 
						todos os pacotes de biblioteca que você está usando 
						também usam async, se chamarem qualquer método 
						Entity Framework que faça com que as consultas sejam 
						enviadas para a base de dados.
Na próxima parte do artigo vamos continuar criando os métodos para realizar as operações CRUD.
						
						Mas longe esteja 
						de mim gloriar-me, a não ser na cruz de nosso Senhor 
						Jesus Cristo, pela qual o mundo está crucificado para 
						mim e eu para o mundo. 
						
						
						Gálatas 6:14
| 
	
    
    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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Entity Framework - Conceitos Básicos - Uma visão geral - Macoratti
Entity Framework - Separando as classes das entidades do ... - Macoratti
Entity Framework 6 - Aplicação em camadas - Definindo o ... - Macoratti
C# - Cadastro de Clientes com Entity Framework em ... - Macoratti
NET - Entity Framework 5 - Operações CRUD (revisitado) - Macoratti