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:


José Carlos Macoratti