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: