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: