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:
  • produtoid
  • produtonome
  • categoriaid

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:

José Carlos Macoratti