VB .NET - Usando o Entity
Framework com MySQL no VS 2008 - II
No artigo anterior eu criei o banco de dados no MySQL , a solução no Visual Studio 2008 SP1 e gerei o Entity Data Model (EDM) a partir do banco de dados Cadastro.
Vou continuar mostrando como implementar as operações CRUD contra o banco de dados MySQL usando os recursos do Entity Framework.
Repetindo o final do artigo criamos a interface no projeto ef_interface e agora vamos implementar as funcionalidades citadas.
O leiaute da interface é mostrada abaixo:
![]() |
Controles do formulário: - 3 TextBox
- 5 Buttons
- 1 DataGridView
|
Todas as funcionalidades serão implementadas através do evento Click dos botões de comando.
Para tornar mais claro o entendimento e ressaltar os recursos do Entity Framework eu vou usar uma sintaxe básica e vou usar o tratamento de erros simplificado através do bloco Try/Catch.
Antes de iniciar devemos declarar o namespace Imports ef_entities; (Lembre-se que referenciamos o projeto ef_entities)
A seguir devemos declarar duas variáveis objeto que serão instanciadas mais tarde:
Dim cadastroContexto As cadastroEntitiesVou iniciar com a funcionalidade para exibir os dados da tabela Produtos no controle DataGridView - gdvProdutos. A idéia é criar uma rotina chamada exibirProdutos() e chamar esta rotina no evento Load do formulário e no evento Click do botão Exibir, de forma que os dados serão exibidos quando o formulário for carregado e toda vez que o cliente clicar no botão Exibir.
O código da rotina é dado a seguir:
Private Sub exibirProdutos()
Try
cadastroContexto = New cadastroEntities
produtoLista = New List(Of produtos)
Dim produtosConsulta = From p In cadastroContexto.produtos.ToList
gdvProdutos.DataSource = produtosConsulta.ToList
Catch ex As Exception
MsgBox("Erro : " & ex.Message)
End Try
End Sub
|
Criamos uma instância do nosso modelo de entidades - cadastroEntities (é através que temos acesso aos métodos para persistência.)
Definimos a consulta LINQ onde obtemos todos os produtos cadastrados: Dim produtosConsulta = From p In cadastroContexto.produtos.ToList
Exibimos os produtos no DataGridView: gdvProdutos.DataSource = produtosConsulta.ToList
Essa rotina será chamada no evento Load e Click e o código correspondente é dado a seguir:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
exibirProdutos()
End Sub
|
| Código do evento Load do formulário form1 |
Private Sub btnExibir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibir.Click
exibirProdutos()
End Sub
|
| Código do evento Click do botão Exibir |
Ao executar o projeto o resultado será a exibição dos produtos conforme a figura abaixo::
![]() |
Para incluir um novo produto usamos o seguinte código no evento Click do botão Novo:
Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNovo.Click
Try
Dim novoProduto As New produtos
novoProduto.nome = txtNome.Text
novoProduto.valor = txtValor.Text
novoProduto.id = -1
cadastroContexto.AddToprodutos(novoProduto)
cadastroContexto.SaveChanges()
MsgBox("Um novo produto foi incluído")
Catch ex As Exception
MsgBox("Erro : " & ex.Message)
End Try
End Sub
|
No código acima primeiro criamos uma instância da nossa entidade produtos e em seguida atribuímos os valores informados no formulário ao objeto novoProduto, e, incluímos o novo objeto novoProduto na coleção de objetos : cadastroContexto.Add(novoAutor)
| Você pode
incluir novos objetos a um contexto de objeto através do método AddObject
ou chamando um dos métodos AddToEntitySetName do
ObjectConext.
Você também pode incluir um objeto a um contexto de objeto adicionando o objeto a um EntityCollection existente. Quando você chama o método Add em um EntityCollection que esta anexada a um contexto de objeto , o objeto que você esta incluindo é adicionado ao mesmo ObjectContext. |
Na linha de código cadastroContexto.AddToAutor(novoAutor) o método AddTo<EntityName>, que é usado pelo EF baseado nas entidades geradas a partir do banco de dados,e , irá realizar a inclusão do novo objeto no contexto.
O método SaveChanges() do contexto é usado para persistir as alterações no banco de dados.
| Lembre-se que o
EF usa o modelo de concorrência otimista e isso significa que não são
realizados bloqueios nos dados na fonte de dados. O padrão porém é o
Object Services salvar as alterações nos objetos para o
banco de dados sem verificar a concorrência. Havendo uma grande possibilidade de ocorrer concorrência é recomendado que a propriedade da entidade seja definida na camada conceitual com um atributo:
ConcurrencyMode="fixed"
Ex:
<Property Name="Status" Type="Byte" Nullable="false"
ConcurrencyMode="Fixed" /> |
O código para excluir um produto é dado a seguir:
Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcluir.Click
Try
cadastroContexto = New cadastroEntities
Dim p As New produtos
p.id = txtID.Text
Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)
cadastroContexto.DeleteObject(prod)
cadastroContexto.SaveChanges()
MsgBox("Um produto foi excluido")
Catch ex As Exception
MsgBox("Erro : " & ex.Message)
End Try
End Sub
|
O código cria uma instância da nossa entidade produtos e em seguida atribui o valor informado pelo cliente na caixa de texto referente ao código do produto;
Em seguida usamos uma consulta LINQ para localizar a primeira (First) ocorrência cujo código do produto seja igual ao ID informado.
Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)
A seguir o método DeleteObject() marca o objeto para deleção a partir do ObjectStateManager, sendo que o objeto é efetivamente excluído quando o método SaveChanges é chamado.
Para alterar uma informação usamos o seguinte código:
Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click
Try
cadastroContexto = New cadastroEntities
Dim p As New produtos
p.id = txtID.Text
p.nome = txtNome.Text
p.valor = txtValor.Text
'localiza o produto a alterar
Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)
'efetua as alteracoes
prod.nome = p.nome
prod.valor = p.valor
cadastroContexto.SaveChanges()
MsgBox("Um produto foi alterado")
Catch ex As Exception
MsgBox("Erro : " & ex.Message)
End Try
End Sub
|
Primeiro criamos uma instância do nosso modelo de entidades - cadastroEntities
A seguir criamos uma instância da nossa entidade produtos e em seguida atribuímos os valores informados no formulário estes valores é que irão alterar os valores originais.
Em seguida usamos uma consulta LINQ para localizar a primeira (First) ocorrência cujo código do produto seja igual ao ID informado.
Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)
A seguir alteramos os valores originais e usamos o método SaveChanges() do contexto é usado para persistir as alterações no banco de dados.
Além dessa funcionalidades eu criei um tratamento no evento CellClick do controle DataGridView de modo que quando o usuário clicar em uma célula do controle os valores irão preencher as caixas de texto do formulário. O código é o seguinte:
Private Sub gdvProdutos_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles gdvProdutos.CellClick
Dim i As Integer
Dim j As Integer
j = gdvProdutos.RowCount - 1
i = gdvProdutos.CurrentRow.Index
If i <= j Then
txtID.Text = gdvProdutos.Item(0, i).Value
txtNome.Text = gdvProdutos.Item(1, i).Value
txtValor.Text = gdvProdutos.Item(2, i).Value
Else
txtID.Text = ""
txtNome.Text = ""
txtValor.Text = ""
End If
End Sub
|
Abaixo temos uma tela exibindo o recurso acima e a funcionalidade para alterar os dados de um produto:

Com isso mostramos como usar o
Entity
Framework com um banco de dados MySQL no Visual Studio 2008 com SP1. Esse
exemplo foi somente um 'tira-gosto' visto que usamos somente uma tabela.
Em um
cenário mais complexo com relacionamentos, chave estrangeira e herança
existem alguns detalhes relativos ao MySQL que deverão ser levados em conta.
Aguarde em breve mais artigos sobre o
assunto...![]()
Pegue o projeto completo aqui:
EF_MySQL.zip
Eu sei é apenas Entity Framework , mas eu gosto...
![]()
Referências:
José Carlos Macoratti