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 é mostrado
abaixo:

Controles do formulário:
– 3 TextBox
- txtID
- txtNome
- txtValor
– 5 Buttons
- btnNovo
- btnAlterar
- btnExcluir
- btnExibir
- btnSair
– 1 DataGridView
- gdvProdutos
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 cadastroEntities - Dim produtoLista As
List(Of produtos)
Vou 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()<br /><br /> Try<br /><br /> cadastroContexto = New cadastroEntities<br /> produtoLista = New List(Of produtos)<br /><br /> Dim produtosConsulta = From p In cadastroContexto.produtos.ToList<br /><br /> gdvProdutos.DataSource = produtosConsulta.ToList<br /><br /> Catch ex As Exception<br /> MsgBox("Erro : " & ex.Message)<br /> End Try<br /><br />End SubCriamos uma instância do nosso modelo
de entidades – cadastroEntities (é através dela 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<br /> exibirProdutos()<br />End SubCó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<br /> exibirProdutos()<br />End SubCó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<br /> Try<br /> Dim novoProduto As New produtos<br /> novoProduto.nome = txtNome.Text<br /> novoProduto.valor = txtValor.Text<br /> novoProduto.id = -1<br /> cadastroContexto.AddToprodutos(novoProduto)<br /> cadastroContexto.SaveChanges()<br /> MsgBox("Um novo produto foi incluído")<br /> Catch ex As Exception<br /> MsgBox("Erro : " & ex.Message)<br /> End Try<br /> End SubNo 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 está anexado a um contexto de objeto, o objeto que você está 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 de 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” />
Dessa forma o Object Services irá
verificar por alterações no banco de dados antes de salvar as mudanças para
o banco de dados e qualquer conflito irá causar uma exceção
OptimisticCuncurrencyException.
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<br /><br /> Try<br /> cadastroContexto = New cadastroEntities<br /><br /> Dim p As New produtos<br /> p.id = txtID.Text<br /><br /> Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)<br /><br /> cadastroContexto.DeleteObject(prod)<br /> cadastroContexto.SaveChanges()<br /><br /> MsgBox("Um produto foi excluido")<br /> Catch ex As Exception<br /> MsgBox("Erro : " & ex.Message)<br /> End Try<br /> 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<br /><br /> Try<br /> cadastroContexto = New cadastroEntities<br /> Dim p As New produtos<br /> p.id = txtID.Text<br /> p.nome = txtNome.Text<br /> p.valor = txtValor.Text<br /><br /> 'localiza o produto a alterar<br /> Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)<br /><br /> 'efetua as alteracoes<br /> prod.nome = p.nome<br /> prod.valor = p.valor<br /> cadastroContexto.SaveChanges()<br /><br /> MsgBox("Um produto foi alterado")<br /> Catch ex As Exception<br /> MsgBox("Erro : " & ex.Message)<br /> End Try<br /> End SubPrimeiro 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, que é 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,<br />ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles<br />gdvProdutos.CellClick<br /> Dim i As Integer<br /> Dim j As Integer<br /> j = gdvProdutos.RowCount - 1<br /> i = gdvProdutos.CurrentRow.Index<br /> If i <= j Then<br /> txtID.Text = gdvProdutos.Item(0, i).Value<br /> txtNome.Text = gdvProdutos.Item(1, i).Value<br /> txtValor.Text = gdvProdutos.Item(2, i).Value<br /> Else<br /> txtID.Text = ""<br /> txtNome.Text = ""<br /> txtValor.Text = ""<br /> End If<br /> End SubAbaixo 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…








