ASP .NET
MVC - Realizando as operações CRUD de forma Assíncrona
![]() |
Este artigo explica mostra como realizar as operações CRUD de forma assíncrona em uma aplicação ASP .NET MVC usando os recursos do Scaffolding. |
Este artigo usa basicamente os recursos da ASP .NET MVC e o Scaffolding para criar todo o código para realizar operações CRUD de forma assíncrona com base em um modelo definido por uma classe de domínio que vai usar o Entity Framework 6.0 Code First para criar o banco de dados a tabela.
O MVC Scaffolding é um framework de geração de código para aplicativos ASP.NET MVC que de forma automática cria estruturas nos Controllers e nas Views das operações CRUD (Create, Read, Update e Delete) usando um modelo de dados ou um modelo vazio. |
A programação assíncrona tem sido um território onde poucos se atrevem a se aventurar pois até o momento esse território tem sido muito pantanoso e cheio de areia movediça.
Com o advento da Microsoft .NET Framework 4.5 isso mudou; a partir dessa versão tanto a linguagem C# como a VB .NET permitem que um "programador comum" possa escrever métodos assíncronos da mesma forma que escrevia métodos síncronos.
Todo esforço necessário para contornar os problemas oriundos da programação assíncrona que os programadores tinham que fazer para que os seus métodos assíncronos pudessem funcionar foi abstraído pelos novos recursos.
Você pode apenas usar o recurso sem se preocupar com o que esta ocorrendo nos bastidores ou pode querer entender qual o custo essa abstração vai ter para continuar tendo um controle total sobre o seu código.
Em uma aplicação
web isso é ainda mais sensível, pois não são reservados no servidor muitos
processos, e, se a carga aumenta no servidor web, então é possível que todos os
processos estejam em uso. Nessa situação, o servidor não pode lidar com uma nova
solicitação até que os processos sejam liberados.
Na programação síncrona, os processos de trabalho podem ficar amarrados enquanto
eles não estão realmente fazendo qualquer trabalho, porque eles estão à espera
para concluir as de I/O.
Quando usamos a programação assíncrona, mesmo quando as operações de I/O não
estão encerradas, os processos de trabalho são liberados para o uso posterior.
Assim, a programação assíncrona permite que os recursos do servidor sejam usados
de forma mais eficiente.
No exemplo deste artigo veremos como é simples criar uma aplicação que realiza o CRUD de forma assíncrona usando o Scaffolding.
Recursos usados:
ASP .NET MVC 5.1
SQL Server 2012 Express Edition
Entity Framework (Code First)
Criando o projeto no VS Community 2013
Abra o VS Community 2013 clique em New Project;
Selecione Visual Basic (ou Visual C#) -> web e o template ASP .NET Web Application e informe o nome MVC_Assincrono e clique no botão OK;
A seguir selecione o template MVC e clique no botão OK;
Será criado a solução contendo um projeto com toda a estrutura pronta para a aplicação MVC. Abaixo vemos a estrutura do projeto na janela Solution Explorer:
Se você selecionar o projeto e clicar no ícone Show All
Files ( )
verá que também foram incluídas diversas referências ao nosso projeto incluindo
a referência ao Entity Framework:
Definindo o modelo de dados (Model)
Agora vamos definir o nosso modelo de domínio que será usado para criar o banco de dados e a tabela no SQL Server usando o Entity Framework Code First.
Para isso vamos incluir uma classe chamada Funcionario.vb na pasta Models. Clique com o botão direito sobre a pasta Models e a seguir clique em Add -> Class;
Informe o nome Funcionario e inclua o código abaixo nesta classe:
Public Class Funcionario
Public Enum Genero
Masculino
Feminino
End Enum
Public Property ID As Integer
Public Property Nome As String
Public Property Sexo As Genero
Public Property Cargo As String
Public Property Salario As Decimal
Public Property Cidade As String
Public Property Email As String
End Class
|
public class Funcionario
{
public enum Genero
{
Masculino,
Feminino
}
public int ID { get; set; }
public string Nome { get; set; }
public Genero Sexo { get; set; }
public string Cargo { get; set; }
public decimal Salario { get; set; }
public string Cidade { get; set; }
public string Email { get; set; }
}
|
Vamos agora definir o contexto da nossa aplicação criando uma classe chamada FuncionarioContexto que irá herdar da API DbContext e referenciar a classe Funcionario que acabamos de criar.
Clique com o botão direito sobre a pasta Models e a seguir clique em Add -> Class;
Informe o nome FuncionarioContexto e inclua o código abaixo nesta classe:
Imports System.Data.Entity
Public Class FuncionarioContexto
Inherits DbContext
Public Property Funcionarios() As DbSet(Of Funcionario)
End Class
|
using System.Data.Entity;
public class FuncionarioContexto : DbContext
{
public DbSet<Funcionario> Funcionarios { get; set; }
}
|
Olhe bem para o código acima. Ele é pequeno mas usa a referência ao namespace System.Data.Entity e usa a classe DBcontext.
A classe DbContext é a classe responsável por interagir com os dados como sendo objetos.
Essa classe é responsável pelas seguintes atividades:
EntitySet: DbContext contém entity set (DbSet<TEntity>) para todas as entidades que são mapeadas para tabelas de banco de dados;
Consulta: DbContext converte consultas LINQ to Entities para SQL e as envia para o banco de dados;
Controle de Alterações(Change Tracking) : Ela mantém o controle das mudanças ocorridas nas entidades depois que as consultas foram feitas no banco de dados;
Persistência dos dados: Ela também executa as operações de INSERT, UPDATE e DELETE no banco de dados, com base nos estados entidade;
Caching: DbContext faz primeiro nível de cache por padrão. Ele armazena as entidades que foram recuperadas durante o tempo de vida de uma classe de contexto;
Gerenciamento do relacionamento: DbContext também gerencia o relacionamento usando CSDL, MSL e SSDL nas abordagens DB-First ou Model-First ou usando fluent API na abordagem Code-First;
Materialização do Objeto: DbContext converte os dados da tabela em objetos de entidade;
Como você notou tamanho não é documento, e esse código será suficiente para gerar o banco de dados e a tabela Funcionario no SQL Server usando os recursos do Entity Framework Code-First.
Como podemos definir o nome do banco de dados que deverá ser criado ?
Uma forma de fazer isso é definir na classe FuncionarioContexto um construtor informando o nome do banco de dados que deverá ser chamado pela classe base.
O código da classe com o construtor ficará assim:
Imports System.Data.Entity
Public Class FuncionarioContexto
Inherits DbContext
Public Sub New()
MyBase.New("Cadastro_MVC")
End Sub
Public Property Funcionarios() As DbSet(Of Funcionario)
End Class
|
Dessa forma será criado o banco de dados Cadastro_MVC no SQL Server e a tabela Funcionarios.
Nota: Usando Data Annotations podemos personalizar o banco de dados, as tabelas e seus campos.
Compile o projeto e verifique se não existem erros.
Criando o controlador e as views via Scaffolding
Vamos agora criar o controlador e as respectivas views usando o MVC Scaffolding.
Para isso clique com o botão direito sobre a pasta Controllers e a seguir clique em Add -> Controller;
Na janela Add Scaffold selecione a opção : MVC 5 Controller with views usando Entity Framework e clique no botão Add:
Na janela Add Controller informe as informações para a classe de modelo, a classe de contexto marque as opções conforme mostra a figura abaixo:
Observe que marcamos a opção : Use async controller actions para que o código seja gerado com os recursos da programação assíncrona da plataforma .NET 4.5.
Ao clicar no botão Add teremos a geração dos seguintes recursos:
1- A classe FuncionarioController na pasta Controllers - Observe que o código gerado para a classe usa os recursos da programação assíncrona.
Se você espiar o código do método Index() por exemplo, verá que ele agora é um método assíncrono(Async) que informa ao compilador para gerar callbacks para partes do método e criar automaticamente um objeto Task(Of ActionResult) que é retornado :
' GET: Funcionario
Async Function Index() As Task(Of ActionResult)
Return View(Await db.Funcionarios.ToListAsync())
End Function
|
Você também pode verificar que o tipo de retorno do método é Task(Of ActionResult) no qual Task(Of T) mostra o trabalho atual com o resultado do mesmo tipo (T).
A
palavra-chave Await chama o serviço. Em segundo plano, o método se divide
em duas partes:
A primeira parte termina com as operações que são iniciadas de forma assíncrona;
A segunda parte é colocada em um método de retorno de chamada que é chamado quando a operação for concluída.
2 - As views : Create, Delete, Details, Edit e Index na pasta \Views\Funcionario
Dessa forma temos tudo pronto para rodar a nossa aplicação MVC e teremos a criação do banco de dados, da tabela e podermos realizar todas as operações CRUD de forma assíncrona.
Nota: Você pode personalizar os títulos, mensagens e textos alterando os arquivos views da pasta Funcionario, o arquivo _Layout.vbhtml da pasta Shared e o arquivo HomeController.vb da pasta Controllers. No arquivo _Layout.vbhtml inclua o código abaixo para exibir o menu Funcionarios: .... <ul class="nav navbar-nav"> <li>@Html.ActionLink("Home", "Index", "Home")</li> <li>@Html.ActionLink("Funcionarios", "Index", "Funcionario")</li> <li>@Html.ActionLink("Sobre", "About", "Home")</li> <li>@Html.ActionLink("Contato", "Contact", "Home")</li> </ul> ... |
Executando a aplicação teremos o seguinte resultado:
1- A página principal
2- Clicando no menu Funcionarios teremos a página para criar um novo funcionário:
![]() |
3- Clicando no link Criar Novo Funcionário temos a página a seguir onde podemos informar os dados de um novo funcionário
4- Abaixo vemos o funcionário cadastrado e as opções para editar, ver detalhes e deletar:
5- Clicando no link Deletar temos a página abaixo onde podemos confirmar ou não a exclusão do funcionário:
E, para concluir, vamos abrir o SQL Server e verificar o banco de dados Cadastro_MVC e a tabela Funcionarios criados. Onde vemos o registro que incluímos no exemplo persistido na tabela:
Pegue o projeto completo aqui :
MVC_Assincrono.zip
Em tudo somos atribulados, mas não
angustiados; perplexos, mas não desanimados.
Perseguidos, mas não desamparados; abatidos, mas não destruídos;
Trazendo sempre por toda a parte a mortificação do Senhor Jesus no nosso corpo,
para que a vida de Jesus se manifeste também nos nossos corpos;
2 Coríntios 4:8-10
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: