ASP .NET - Usando os recursos do Entity Framework 4 : First-Model e CRUD - 2


Na primeira parte deste artigo criamos o modelo de entidades do nosso domínio através do Entity Data Model e a partir dele criamos o nosso banco de dados e as tabelas Clientes e Enderecos usando o modelo que se chama First-Model, estamos prontos portanto para trabalhar com nossa base de dados e realizar consultas e operações de manutenção de dados. É isso que iremos fazer nesta segunda parte.

Vamos criar uma interface com o usuário usando o arquivo Default.aspx. Selecione o arquivo e no modo Design inclua uma tabela a partir do menu Table-> Insert Table com duas colunas e 5 linhas;

A seguir inclua os seguintes controles na tabela a partir da ToolBox:

O leiaute da página Default.aspx deverá ser igual a da figura abaixo:

O código fonte da página pode ser visto a seguir:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="Agenda._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <table>
  <tr>
    <td>Selecione um Cliente:</td>
    <td><asp:DropDownList runat="server" ID="ddlClientes" AutoPostBack="True" 
            Height="16px" Width="177px">
        </asp:DropDownList> </td>
  </tr>        
  <tr>
    <td>Nome :</td>
    <td><asp:TextBox runat="server" ID="txtNome" Width="181px"></asp:TextBox></td>
  </tr>
  <tr>
    <td>Email:</td>
    <td><asp:TextBox runat="server" ID="txtEmail" Width="180px"></asp:TextBox></td>
  </tr>
  <tr>
    <td>Inserido em:</td>
    <td><asp:Label runat="server" ID="lblInseridoEm"></asp:Label> </td>
  </tr>
  <tr>
    <td>Atualizado em:</td>
    <td><asp:Label runat="server" ID="lblAtualizaodEm"></asp:Label> </td>
  </tr>
</table>    
<asp:Button runat="server" ID="btnSalvar" Text="Salvar" />
<asp:Button ID="btnDeletar" runat="server" Text="Deletar" />
    </div>
    </form>
</body>
</html>

Agora que temos a nossa interface pronta podemos partir para a nossa primeira tarefa que será exibir as informações dos clientes.

Entity Framework 4 - Exbindo informações

Vamos carregar o controle DropDownList - ddlClientes - no evento Load da página Default.aspx com as informações dos clientes presentes na tabela Clientes.

Para isso vamos incluir o seguinte código no evento Load da página no arquivo code-behind Default.aspx.vb:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            carregarClientes()
        End If
    End Sub

Verificamos se a requisição não é um PostBack e chamamos a rotina carregarClientes(). Vamos criar esta rotina conforme o código a seguir:

  Private Sub carregarClientes()

        Using db As New AgendaContainer()

            ddlClientes.DataSource = From a In db.Clientes
                                                   Order By a.Nome
                                                   Select a.Nome, a.Id

            ddlClientes.DataTextField = "Nome"
            ddlClientes.DataValueField = "Id"
            ddlClientes.DataBind()

            ddlClientes.Items.Insert(0, New ListItem("Criar novo Cliente", ""))
        End Using
    End Sub

Vamos entender o código :

Inicialmente estamos criando uma instância do nosso contexto chamado AgendaContainer, este contexto foi criado pelo Entity Data Model quando criamos o arquivo Agenda.edmx. Este objeto é parecido com um objeto Connection da ADO .NET, assim usamos a AgendaContainer para realizar a conexão com o banco de dados e manipular as entidades definidas.

Usando uma consulta LINQ estamos selecionando o nome e o Id da entidade Clientes e atribuindo o resultado a propriedade DataSource do controle DropDownList - ddlClientes. O Entity Framework irá traduzir a sintaxe desta consulta para uma consulta SQL.

Definimos as propriedades DataTextField que indica o nome da propriedade da entidade Clientes que vamos exibir na caixa de listagem;

A propriedade DataValueField define o valor da propriedade da entidade Clientes que será usado quando a seleção de um valor for realizada;

Incluímos o texto "Criar novo Cliente" no DropDownList na primeira linha;

Executando a página iremos obter o seguinte resultado:

Vamos agora exibir as informações do cliente selecionado nos controles TextBox da página.

Para isso vamos usar o evento SelectedIndexChanged do controle DropDownList - ddlClientes.

Inclua o código abaixo neste evento:

Protected Sub ddlClientes_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ddlClientes.SelectedIndexChanged
        'se nada for selecionado então limpa os controles da página
        If ddlClientes.SelectedValue = "" Then
            txtNome.Text = ""
            txtEmail.Text = ""
            lblInseridoEm.Text = ""
            lblAtualizadoEm.Text = ""
        Else
            'Obtem o usuário a partir do banco de dados
            Using db As New AgendaContainer()

                'obtem o valor do id do cliente a partir do item selecionado na caixa de listagem
                Dim clienteId As Integer = Convert.ToInt32(ddlClientes.SelectedValue)
                'obtem os objeto clientes a partir do id do cliente selecionado 
                Dim clientesLista As List(Of Cliente) = (From a In db.Clientes _
                                                                          Where a.Id = clienteId _
                                                                          Select a).ToList()

                'se houver clientes então preenche os controles da página
                If clientesLista.Count() > 0 Then
                    'define uma variavel clienteLista do tipo Cliente e atribui
                    'o primeiro objeto da lista
                    Dim clienteLista As Cliente = clientesLista(0)
                    'atribui os valores das propriedades do objeto Cliente as caixas de texto
                    txtNome.Text = clienteLista.Nome
                    txtEmail.Text = clienteLista.Email
                    lblInseridoEm.Text = clienteLista.camposAuditoria.dataInclusao.ToString()
                    lblAtualizadoEm.Text = clienteLista.camposAuditoria.dataAtualizacao.ToString()
                Else
                    'Se não achar o cliente limpa os controles da página
                    txtNome.Text = ""
                    txtEmail.Text = ""
                    lblInseridoEm.Text = ""
                    lblAtualizadoEm.Text = ""
                End If

            End Using
        End If

    End Sub

Agora se executarmos o projeto ao selecionar um cliente veremos as suas informações na página:

Entity Framework 4 - Incluindo e atualizando informações

Nossa próxima missão será incluir e atualizar informações usando os recursos do Entity Framework.

Vamos usar o evento Click do botão Salvar incluindo o código abaixo neste evento:

   Protected Sub btnSalvar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSalvar.Click

        Using db As New AgendaContainer()

            Dim cliente As New Cliente()

            cliente.Nome = txtNome.Text
            cliente.Email = txtEmail.Text
            cliente.camposAuditoria.dataAtualizacao = DateTime.Now

            If ddlClientes.SelectedItem.Value = "" Then
                'Incluindo                    
                cliente.camposAuditoria.dataInclusao = DateTime.Now
                db.AddToClientes(cliente)
            Else
                'Atualizando
                cliente.Id = Convert.ToInt32(ddlClientes.SelectedValue)
                cliente.camposAuditoria.dataInclusao = Convert.ToDateTime(lblInseridoEm.Text)

               db.Clientes.Attach(cliente)
               db..ObjectStateManager.ChangeObjectState(Clientes,EntityState.Modified)
            End If

            db.SaveChanges()

            lblInseridoEm.Text = cliente.camposAuditoria.dataInclusao.ToString()
            lblAtualizadoEm.Text = cliente.camposAuditoria.dataAtualizacao.ToString()

            're-carrega a caixa de listagem
            carregarClientes()

            'Selecione um usuário que acabou de ser persistido
            ddlClientes.Items.FindByValue(cliente.Id.ToString()).Selected = True

        End Using
    End Sub

Este código inicia pela instanciação de um objeto AgendaContainer e então cria uma nova instância do objeto Cliente.

O nome e o Email são atribuídos a partir dos valores informados pelo usuário na página e a data de atualização é definida como a data/hora atual.

Em seguida verificamos se o item selecionado na caixa de listagem esta em branco o que significa que o usuário selecionou a opção Criar um novo Cliente.

Se o usuário estiver incluindo um novo cliente então a data de inclusão é definida como sendo a data/hora atual e o objeto é incluindo na lista de objetos Cliente associado com o AgendaContainer. Isto não inclui a informação no banco de dados mas apenas faz com que o AgendaContainter saiba que este objeto será incluído no banco de dados.

Se o usuário estiver atualizando um registro então o Id é definido para o Id do item selecionado na caixa de listagem e a data de inclusão não será alterada e desta forma a data que será exibida é a data que esta sendo exibida no controle Label.

Como não estamos incluindo o registro precisamos chamar o método Attach no objeto Clientes e dessa forma dizemos ao AgendaContainer que o objeto existe.

Em seguida precisamos informar ao AgendaContainer para atualizar o registro associado com este objeto e para fazer isso chamamos o método ObjectStateManager.ChangeObjectState passando o objeto a ser atualizado e o valor da enumeração EntityState.Modified.

O método db.SaveChanges() é quem vai executar ou a inclusão (INSERT) ou a atualização (UPDATE) contra o banco de dados.

Após os dados serem persistidos (incluídos ou atualizados) as informações na tela são atualizadas para refletir as mudanças ocorridas.

Entity Framework 4 - Excluindo informações

O código para excluir informações é colocado no evento Click do botão Deletar conforme abaixo:

  Protected Sub btnDeletar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDeletar.Click

        If ddlClientes.SelectedItem.Value <> "" Then

            Using db As New AgendaContainer()
                Dim cliente As New Cliente()
                cliente.Id = Convert.ToInt32(ddlClientes.SelectedValue)
                db.Clientes.Attach(cliente)
                db.ObjectStateManager.ChangeObjectState(cliente, System.Data.EntityState.Deleted)
                db.SaveChanges()

                carregarClientes()
                txtNome.Text = ""
                txtEmail.Text = ""
                lblInseridoEm.Text = ""
                lblAtualizadoEm.Text = ""
            End Using

        End If

    End Sub

Este código cria uma instância do objeto Cliente e define a sua propriedade Id para o valor que foi selecionado no dropdownlist.

Para deletar um registro ainda temos que anexá-lo via método Attach no objeto Clientes e dessa forma dizemos ao AgendaContainer que o objeto existe em seguida informamos ao ObjectStateManager o que fazer(System.Data.EntityState.Deleted) com o objeto quando o método SaveChanges for chamado.

Após isso recarregamos o controle dropdownlist para atualizar a exibição das informações.

Eu sei é apenas Entity Framework 4, mas eu gosto...

Simples, simples assim...

Referências:

José Carlos Macoratti