ASP .NET MVC 2 - Efetuando CRUD com Entity Framework (VB .NET)
Recentemente publiquei uma série de artigos sobre o ASP .NET MVC mostrando como realizar as operações CRUD com o Entity Framework usando a linguagem C#.
Atendendo a pedidos estou publicando uma versão resumida do mesmo artigo agora usando a linguagem VB .NET de forma a atender a comunidade VB .NET que pretende usar a tecnologia ASP .NET MVC.
Para este exemplo eu estou usando o Visual Web Developer 2010 Express Edition e o banco de dados SQL Server 2005.
Vamos criar uma aplicação ASP .NET usando o template ASP .NET MVC 2 Web Application e com isso ter a estrutura da aplicação MVC já criada pelo Visual Studio.
Depois vamos acessar os dados da tabela Produtos no banco de dados Macoratti.mdf e criar as páginas para exibir, editar e excluir registros em uma aplicação MVC.
O banco de dados Macoratti.mdf foi criado no SQL Server 2005 Express Edition usando a ferramenta Management Studio e a tabela Produtos possui a seguinte estrutura:
A estrutura da tabela
Produtos é muito simples:
onde produtoid é a chave primária do tipo identity. |
Após você clicar no botão OK , num passe de mágica o Visual Studio irá criar toda a estrutura do projeto MVC
A estrutura do projeto web exibe 3 pastas principais:
Obs: A pasta Content é usada apenas para conter arquivos de estilo CSS que definirão a aparência do site e a pasta Scripts contém scripts JQuery.
Embora essa seja a estrutura padrão de um projeto criado no ASP .NET MVC você pode alterar essa estrutura se tiver um bom motivo para isso.
Para detalhes sobre o assunto veja o meu artigo: ASP .NET MVC 2.0 - Criando uma aplicação MVC básica (C#) - 1
Vamos ao que interessa...
Vamos criar um Entity Data Model para configurar a conexão com o banco e fazer o mapeamento da nossa tabela para entidade.
Vamos começar definindo o nosso Modelo de entidades criando um Componente model usando o Entity Framework clicando com o botão direito sobre a pasta Model e selecionando a opção Add -> New Item;
A seguir selecione na guia Data o template ADO .NET Data Model e informe o nome Produtos.edmx clicando em Add;
Na próxima janela do Assistente selecione a opção Generate From DataBase pois vamos gerar no nosso model a partir do banco de dados Macoratti.mdf, tabela Produtos;
Na última janela do assistente vamos selecionar a tabela Produtos para gerar o modelo de entidades para esta tabela pois queremos tratar os produtos na nossa aplicação;
Clicando em Finish encerramos esta etapa;
O arquivo Produtos.edmx é o nosso model.
Vamos alterar o arquivo Site.Master
que esta na pasta Shared que por sua vez esta no interior da
pasta Views.incluindo
a linha :
<li><%:
Html.ActionLink("Produtos", "Index",
"Produto")%></li>
Para termos acesso a link Produtos que irá chamar a página Index.aspx da pasta Produto;
Inclua a linha em negrito de forma a poder exibir o link Produto na Master Page:
<ul
id="menu"> <li><%: Html.ActionLink("Home", "Index", "Home")%></li> <li><%: Html.ActionLink("Produto", "Index", "Produto")%></li> <li><%: Html.ActionLink("Sobre", "About", "Home")%></li> </ul> |
Criando o Controller
Agora vamos criar o controller para a nossa aplicação. Clique com o botão direito sobre a pasta Controllers da aplicação na janela Solution Explorer e selecione a opção Add -> Controller;
Na janela Add Controle altere o primeiro nome do controller para ProdutoController e marque as opções para incluir os métodos para Create, Update, Delete e Details;
O arquivo ProdutoController.cs será criado e os métodos : Index, Details, Create, Edit e Delete, estarão definidos faltando apenas implementá-los.
É o que vamos fazer, definir cada um destes métodos e em seguida criar o View para cada um deles.
Observe que os métodos Create, Edit e Delete possuem duas formas sobrecarregadas um para o GET e outro para o POST;
Vamos criar uma instância do nosso contexto que foi criado quando geramos EDM no arquivo Produtos.edmx no arquivo ProdutoController.cs;
Dim entidades As New MacorattiEntities
e a seguir vamos definir o método Index que irá retornar a página contendo a relação de produtos:
' GET: /Produto Function Index() As ActionResult Dim entidades As New MacorattiEntities Dim lista As List(Of Produto) = entidades.CreateObjectSet(Of Produto)().ToList() Return View(lista) End Function |
Neste código estamos retornando uma lista dos produtos obtidos no banco de dados;
Criando a View
Para exibir essa lista devemos criar uma View e para isso clique com o botão direito do mouse sobre Index() e no menu suspenso selecione Add View;
Na janela Add View temos que configurar a View que vamos criar definindo alguns itens:
Executando neste momento o projeto ao clicarmos no menu Produto iremos obter a relação de produtos:
Definindo a Action Details
Vamos continuar definindo a Action Details do nosso Controller ProdutoController.
Na janela Solution Explorer selecione o arquivo ProdutoController na pasta Controller e inclua o código conforme indicado na Action Result Details;
' GET: /Produto/Details/5 Function Details(ByVal id As Integer) As ActionResult Dim entidades As New MacorattiEntities Dim produto As Produto = entidades.CreateObjectSet(Of Produto)().Where(Function(p) p.produtoid = id).ToList().First() Return View(produto) End Function |
O código obtém retorna uma entidade produto obtida pela consulta LINQ que recebe o id como parâmetro.
Vamos criar a View para exibir os detalhes do produto clicando com o botão direito do mouse sobre o método Details e selecionando a opção Add View do menu suspenso. Será aberta a janela onde vamos definir os seguintes itens:
Após isso clique no botão Add;
Serás cria o arquivo Details.aspx na pasta Produto que será mapeada como : Produto/Details/id onde o id representa o código do produto.
Executando novamente o projeto e selecionando um produto e clicando no link Details a página a seguir será exibida mostrando os detalhes do produto:
Observe que temos na url a chamada : ../Produto/Details/1 que será mapeada para a página Details.aspx da pasta Produto onde o número 1 representa o id do produto;
Definindo a Action Create
Prosseguindo vamos definir a Action Create que nos permitirá criar um novo produto.
Para definir a Action Create temos que escrever dois métodos distintos para tratar esta ação:
1-) O primeiro irá exibir a view sem dados apresentando a página para entrada de dados; representa o GET;
2-) O segundo irá tratar a postagem da página com os dados informados pelo usuário que deverão ser persistidos no banco de dados; representa o POST;
Abaixo temos a implementação dos dois métodos para a Action Create, sendo que no primeiro (GET) retornamos apenas a View;
No código criamos um novo objeto produto e atribuímos os valore informados e a seguir incluimos o objeto produto na entidade usando o método AddObject do ObjecContext gerado pelo EDM para incluir a entidade e para salvar a entidade usamos o método SaveChanges(). O Try/Catch verifica se o modelo não for válido e retorna a view com um erro;
Para criar a View correspondente clique com o botão direito sobre a Action Create e selecione Add View;
A seguir defina os parâmetros conforme a janela a seguir;
O arquivo Create.aspx será criado na pasta Produto.
Executando o projeto e acionando o link Criar Novo temos a página Create.aspx exibindo os campos a serem preenchidos e submetidos. Não precisamos informar o id do produto, apenas o nome do produto e o código da categoria;
Definindo a Action Edit
Vamos continuar definindo a Action Edit do nosso Controller ProdutoController.
Lembrando que a Action Edit é realizada em duas etapas : GET e POST.
Na primeira etapa, o GET, vamos localizar o produto a ser editado e exibir os dados na página;
Na segunda etapa, o POST, vamos submeter as alterações feitas nos dados e usando os recursos do Entity Framework realizar persistência no banco de dados.
Na janela Solution Explorer selecione o arquivo ProdutoController na pasta Controller e inclua o código conforme indicado na primeira Action Result Edit (1);
O código retorna uma entidade produto obtida pela consulta LINQ que recebe o id como parâmetro.
Nesta consulta LINQ estamos usando o operador First que retorna o primeiro elemento da seqüência que satisfaz o critério definido na expressão lambda;
Vamos criar a View para exibir os detalhes do produto para edição clicando com o botão direito do mouse sobre o método Edit e selecionando a opção Add View do menu suspenso. Será aberta a janela onde vamos definir os seguintes itens:
Será cria o arquivo Edit.aspx na pasta Produto que será mapeada como : Produto/Edit/id onde o id representa o código do produto.
Vamos criar agora a segunda parte da Action Edit , o POST. Na janela Solution Explorer selecione o arquivo ProdutoController na pasta Controller e inclua o código conforme indicado na primeira Action Result Edit (2);
Estamos passando o id do produto e um coleção com dados do produto;
Usando uma consulta LINQ procuramos pelo produto e para podermos persistir esta informação na entidade usamos o método ApplyCurrentValues();
O método ApplyCurrentValues(key.EntitySetName,TEntity) aplica as alterações feita na entidade no objeto original obtido do banco de dados.
Este método é usado para aplicar as mudanças que foram feitas a objetos fora do ObjectContext, tais como um objeto desanexado (detached) que são recebidos por um web service. (Você pode usar o EntityKey do objeto detached para retornar uma instância deste objeto a partir da fonte de dados.)
Definindo a Action Delete
Prosseguindo vamos definir a Action Delete que nos permitirá excluir um produto existente.
Para definir a Action Delete temos que escrever dois métodos distintos para tratar esta ação:
1-) O primeiro irá exibir na view os dados do produto selecionado pelo código (id); representa o GET;
2-) O segundo irá tratar a postagem da página submetendo a entidade para exclusão usando os recursos do Entity Framework; representa o POST;
Na primeira parte da implementação, o GET, estamos passando o id do produto e usando uma consulta LINQ para obter a primeira entidade produto com o id informado;
' GET: /Produto/Delete/5 Function Delete(ByVal id As Integer) As ActionResult Dim entidades As New MacorattiEntities Dim produto As Produto = entidades.CreateObjectSet(Of Produto)().Where(Function(p) p.produtoid = id).ToList().First() Return View(produto) End Function |
O segundo método (POST) a Action recebe o id Produto e obtém o prdouto a ser excluído da base de dados usando uma consulta LINQ:
// obtem o produto a
excluir
Dim
produto As Produto = entidades.Produtos.Single(Function(p)
p.produtoid = id)
Em seguida usa o método DeleteObject(produto) para excluir o produto e o método SaveChanges para persistir no banco de dados a exclusão.
// excluir
entidades.DeleteObject(produto);
entidades.SaveChanges();
O código completo pode ser visto abaixo:
<HttpPost> _ Function Delete(ByVal id As Integer, ByVal collection As FormCollection) As ActionResult Try ' TODO: Add delete logic here Dim entidades As New MacorattiEntities Dim produto As Produto = entidades.Produtos.Single(Function(p) p.produtoid = id) entidades.DeleteObject(produto) entidades.SaveChanges() Return RedirectToAction("Index") Catch Return View() End Try End Function |
Para criar a View correspondente clique com o botão direito sobre a Action Delete e selecione Add View;
A seguir defina os parâmetros conforme a janela a seguir;
O arquivo Delete.aspx será criado na pasta Produto.
Executando o projeto e selecionando o produto de id =2 para ser excluído veremos a primeira parte do Action Delete, a GET, exibir as informações do produto e solicitar a confirmação:
Simples, simples assim
Com isso concluímos a criação de todas as Actions e Views para o nosso controller ProdutoController e temos desta forma a realização das operações básicas de manutenção de dados em uma aplicação ASP .NET MVC usando a linguagem VB .NET.
Pegue o projeto completo aqui: MVC_CRUD_EF.zip
Eu sei é apenas ASP .NET MVC, mas eu gosto...
Referências: