 VB .NET - Usando o Entity 
Framework com MySQL no VS 2008 - II
 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
 
EF_MySQL.zip
Eu sei é apenas Entity Framework , mas eu gosto...

Referências:
José Carlos Macoratti