Entity Framework 4.1 - Fazendo o CRUD e nada mais
Em meus últimos artigos sobre o Entity Framework eu dei ênfase ao utilização dos recursos do Code-First e da API DbContext onde a partir da definição do modelo de entidades via classes POCO eram gerados o banco de dados e as tabelas.
O Entity Framework é uma ferramenta OR/M (Mapeamento Objeto Relacional) que realiza o mapeamento objeto relacional gerando entidades e mapeando-as para as tabelas do banco de dados.
Com
a nova versão do Entity Framework (a 4.1) podemos usar
classes POCO para realizar o mapeamento objeto relacional
e a persistência dos dados sem termos que ficar dependentes do Entity Data Model gerado, pois as classes POCO não herdam das classes base geradas pelo EF. |
Hoje vamos entender como atuam as funcionalidades CRUD (Create, Update, Delete) visto que são as mais usadas no dia dia.
É muito simples realizar as operações CRUD no Entity Framework 4.1. Para entender melhor como o processo funciona você deve conhecer alguns conceitos básicos.
Vamos a eles...
Conceitos mais que básicos (e suficientes...)
O EF 4.1 trabalha em um nível de abstração que chamamos entidades que representam os objetos do domínio da sua aplicação que foram definidos no EF.
Uma entidade pode estar em um dos cinco estados abaixo definidos, tal como definido pela enumeração EntityState:
O método SaveChanges faz coisas diferentes para as entidades conforme o seu estado:
Quem gerencia o estado de um entidade é o Object Context que representa o entity container definido em um modelo conceitual e contém a conexão correspondente à fonte de dados e fornece serviços como o gerenciamento de estado e resolução de identidade.
Um object context é representado por uma instância da classe ObjectContext.
Objetivo
O objetivo deste artigo é mostrar de forma simples e descomplicada como realizar as operações CRUD no Entity Framework 4.1
Em resumo iremos realizar as seguintes tarefas:
Recursos
Os recursos necessários para acompanhar o artigo são:
Todos os recursos listados podem ser obtidos de forma gratuita.
Criando a aplicação ASP .NET
Abra o Visual Web Developer 2010 Express Edition e no menu File clique em New Project;
Na janela New Project selecione a linguagem de sua preferência (eu vou usar Visual Basic) e o template ASP .NET Web Application;
Nota: Este template ja cria uma estrutura de um projeto com páginas e arquivos que eu vou ajustar deixando apenas a página Default.aspx e About.aspx;
A seguir informe o nome EF4_Produtos_Poco , a localização do projeto e clique no botão OK;
Definindo a classe POCO para a aplicação
Neste momento vamos definir as classes do nosso domínio que serão as nossas entidades gerenciadas pelo Entity Framework.
Aqui podemos usar o assistente e gerar um Entity Data Model ou definir as classes POCO. A vantagem da primeira é que é mais rápido mas o modelo gerado traz consigo todo o arcabouço do Entity Framework. Usar as classes POCO dá mais trabalho (embora ele tenha sido simplificado nesta versão) mas o código fica bem mais enxuto.
Antes de continuar temos que incluir uma referência ao Entity Framework 4.1 no nosso projeto;
- Clique com o botão
direito do mouse sobre o projeto EF41_Produtos_CRUD e clique em Add
Reference;
- Na janela Add Reference clique na guia Browse
e selecione o assembly EntityFramework.dll do
local onde você instalou o Entity Framework 4.1 e clique em OK;
Vamos incluir também uma referência ao namespace System.Data.Entity repetindo o processo assim e selecionando este namespace conforme abaixo:
Vamos então incluir uma nova classe chamada CadastroPOCO.vb a partir do menu Project -> Add Class;
Em seguida defina o seguinte código nesta classe:
Public Class Produto Public Property produtoid As Integer Public Property produtonome As Integer Public Property produtopreco As Double Public Property produtoestoque As Double End Class |
É isso mesmo que você esta vendo definimos a classe Produto com 4 propriedades apenas.
Agora temos que definir uma classe para o nosso contexto chamada produtoContexto.vb a partir do menu Project -> Add Class;
O código desta classe é visto a seguir:
Imports System.Data.Entity Public Class ProdutoContexto Inherits DbContext Public Property Produto As DbSet(Of Produto) End Class |
É tudo o que precisamos: uma classe que herde de DbContext e defina uma propriedade Produto do tipo DBSet.
O DbSet é um invólucro para ObjectSet e permite que na sua execução o banco de dados e as tabelas sejam criados com base na modelo definido.
Lembre-se que no Entity Framework 4.1 temos:
- ObjectContext - que
permite consultar, controle de alterações e salvar no banco de
dados.
- ObjectSet - que encapsula os conjuntos de objetos
semelhantes.
Dessa forma o DbContext é um invólucro para ObjectContext e além disso esta classe contém:
- Um conjunto de APIs que são mais
fáceis de usar do que a exposta pelo ObjectContext;
- As APIs que permitem utilizar o recurso do Code-First e as
convenções;
O EF Code First permite que você conecte facilmente suas classes POCO do modelo em um banco de dados através da criação de uma classe "DbContext" que expõe propriedades públicas que mapeiam para tabelas do banco de dados. A classe produtoContexto acima ilustra como isso pode ser feito. Ela está mapeando nossa Classe Produto para a tabela "Produtos".
As propriedades da classe Produto por sua vez mapeiam para colunas na tabela Produto.
Dessa forma o banco de dados e a tabela Produto será criada usando uma convenção padrão adotada pelo Entity Framework.(Para alterar esta convenção veja o meu artigo sobre Data Annotations)
Que tal criar o banco de dados e tabela e aproveitar para já incluir alguns dados na mesma. Vamos fazer isso incluindo uma nova classe no projeto chamada InicializaBD.vb com o seguinte código:
Imports System.Data.Entity Namespace EF_Produtos_CRUD Public Class InicializaBD Public Shared Sub geraTabelas(excluiBD As Boolean) Using _contexto As New ProdutoContexto() If excluiBD Then _contexto.Database.Delete() End If Dim produto1 = New Produto() With {.produtonome = "Teclado", .produtopreco = 13, .produtoestoque = 10} _contexto.Produto.Add(produto1) Dim produto2 = New Produto() With {.produtonome = "Mouse Ótico", .produtopreco = 20, .produtoestoque = 5} _contexto.Produto.Add(produto2) _contexto.SaveChanges() End Using End Sub End Class End Namespace |
Podemos ou não utilizar esta classe em nosso projeto e assim já criarmos a tabela com alguns dados armazenados. Você é quem decide.
No exemplo eu não vou usar esta classe.
Definindo a interface da aplicação ASP .NET
Vamos definir o leiaute da página Default.aspx conforme a figura abaixo onde podemos ver que incluímos alguns controles TextBox, Label e Button. Lembrando que estamos usando a Master Page Site.Master que foi ajustada também.
Finalmente vamos definir o código do arquivo code-behind Default.aspx.vb onde em cada evento Click de cada botão iremos incluir o código pertinente.
1- Botão Novo
Protected Sub btnNovo_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnNovo.Click Using db As New ProdutoContexto Dim produto As New Produto produto.produtonome = txtProduto.Text produto.produtopreco = Convert.ToDecimal(txtPreco.Text) produto.produtoestoque = Convert.ToDouble(txtEstoque.Text) db.Produto.Add(produto) db.SaveChanges() lblmsg.Text = "Registro incluido com sucesso !" End Using End Sub |
Cria uma nova instância de Produto e atribui valores as propriedades e inclui o produto no contexto de entidades para em seguida salvar o novo produto.
2 - Botão Atualiza
Protected Sub btnAtualiza_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnAtualiza.Click Using db As New ProdutoContexto Dim codigoProduto As Integer = Convert.ToInt32(txtCodigo.Text) Dim produto As Produto = db.Produto.First(Function(p) p.produtoid = codigoProduto) produto.produtonome = txtProduto.Text produto.produtopreco = txtPreco.Text produto.produtoestoque = txtEstoque.Text db.SaveChanges() lblmsg.Text = "Registro atualizado com sucesso !" End Using End Sub |
Obtém o código do produto e realiza uma consulta lambda para localizar o produto exibindo as informações na página para alteração.
3- Botão Procurar
Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnProcurar.Click lblmsg.Text = "" Using db As New ProdutoContexto Dim codigo As Integer = Convert.ToInt32(txtCodigo.Text) Try Dim produto = db.Produto.Find(codigo) txtCodigo.Text = produto.produtoid txtProduto.Text = produto.produtonome txtPreco.Text = produto.produtopreco txtEstoque.Text = produto.produtoestoque Catch ex As Exception lblmsg.Text = "Registro não localizado !" Limpar() End Try End Using End Sub |
Obtém o código do produto e realiza uma consulta LINQ para localizar o produto exibindo as informações na página.
4- Botão Excluir
Protected Sub btnExcluir_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnExcluir.Click Using db As New ProdutoContexto Dim codigoProduto As Integer = Convert.ToInt32(txtCodigo.Text) Dim produto As Produto = db.Produto.First(Function(p) p.produtoid = codigoProduto) db.Produto.Attach(produto) db.Entry(produto).State = EntityState.Deleted db.SaveChanges() lblmsg.Text = "Registro excluído com sucesso !" End Using End Sub |
Obtém o código do produto e realiza uma consulta lambda para localizar o produto; em seguida anexa o produto e altera seu estado para deletado para em seguida usar o método SaveChanges() para excluir a entidade.
5- Botão Limpar e método Limpar()
Protected Sub btnLimpar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLimpar.Click Limpar() End Sub Private Sub Limpar() txtCodigo.Text = "" txtProduto.Text = "" txtPreco.Text = "" txtEstoque.Text = "" lblmsg.Text = "" End Sub |
Executando o projeto iremos obter a página Default.aspx onde digitando os valores nas caixas de texto e clicando no botão Incluir temos a inclusão de um produto conforme a figura abaixo:
Após executarmos os projeto pela primeira vez se verificamos o SQL Server usando o SQL Server Management Studio iremos descobrir que o banco de dados e a tabela Produtoes foram criados conforme mostra a figura a seguir:
Note que executando uma consulta SQL na tabela também vemos o registro que acabamos de incluir.
A seguir temos as figuras para as operações de inclusão e procura de um produto
Após isso se consultarmos as tabelas no SQL Server veremos os dados persistidos conforme a figura abaixo:
O Entity Framework fez todo o trabalho pesado para nós... Eta vida boa !
Pegue o projeto completo aqui: EF_Produtos_CRUD.zip
Louvai ao Senhor. Bem-aventurado o homem que teme ao Senhor, que em seus mandamentos tem grande prazer. Salmos 112:1
Referências: