Entity Framework 6 - Acessando o PostgreSQL - II (VB .NET)


Em continuação ao artigo anterior neste artigo vamos definir a interface com o usuário e implementar as operações com as entidades usando LINQ e os recursos do Entity Framework 6.

Criando a interface com o usuário e implementando as operações com as entidades

Vamos abrir o formulário form1.vb do projeto e incluir os seguintes controles a partir da ToolBox:

Defina os controles no formulário conforme o leiaute da figura abaixo:

1 - Exibindo informações de Artistas e seus Albuns

No evento Click do botão de comando Exibir vamos incluir o código abaixo:

  Private Sub btnExibir_Click(sender As Object, e As EventArgs) Handles btnExibir.Click
        Using db = New ArteContexto()
            Dim _artistas = From a In db.Artistas Order By a.ArtistaId Ascending
                                 Select a.ArtistaId, a.Nome
            dgvArtistas.DataSource = _artistas.ToList
            formataGridViewArtistas()
            Dim _albuns = From a In db.Albuns Order By a.Artista.ArtistaId Ascending
                               Select a.AlbumId, a.Titulo, a.Artista.Nome
            dgvAlbuns.DataSource = _albuns.ToList
            formataGridViewAlbuns()
        End Using
    End Sub

Temos aqui uma consulta LINQ onde estamos obtemos o codigo e nome dos artigos ordenados pelo código:

Dim _artistas = From a In db.Artistas Order By a.ArtistaId Ascending
                     Select a.ArtistaId, a.Nome

Exibindo o resultado no DataGridView que esta sendo formatado pela chamada da rotina formataGridViewArtistas.

Depois obtemos o código dos álbuns, o título e nome do artista usando a propriedade de navegação ordenados pelo código do artista.

Dim _albuns = From a In db.Albuns Order By a.Artista.ArtistaId Ascending
                     Select a.AlbumId, a.Titulo, a.Artista.Nome

Da mesma forma exibimos o resultado no segundo DataGridView usando uma rotina de formatação quase idêntica à primeira.

O código das rotinas para formatar o DataGridView para exibir artistas e álbuns é visto abaixo:

  Private Sub formataGridViewArtistas()
        With dgvArtistas
            .AutoGenerateColumns = False
            .RowHeadersVisible = False
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
            'altera a cor das linhas alternadas no grid
            .RowsDefaultCellStyle.BackColor = Color.White
            .AlternatingRowsDefaultCellStyle.BackColor = Color.YellowGreen
            'altera o nome das colunas
            .Columns(0).HeaderText = "Id"
            .Columns(1).HeaderText = "Nome"
            'largura colunas
            .Columns(0).Width = 50
            .Columns(1).Width = 200
            'seleciona a linha inteira
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            'não permite seleção de multiplas linhas
            .MultiSelect = False
            ' exibe nulos formatados
            .DefaultCellStyle.NullValue = " - "
            'permite que o texto maior que célula não seja truncado
            .DefaultCellStyle.WrapMode = DataGridViewTriState.True
        End With
    End Sub

 

Private Sub formataGridViewAlbuns()
        With dgvAlbuns
            .AutoGenerateColumns = False
            .RowHeadersVisible = False
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
            'altera a cor das linhas alternadas no grid
            .RowsDefaultCellStyle.BackColor = Color.White
            .AlternatingRowsDefaultCellStyle.BackColor = Color.YellowGreen
            'altera o nome das colunas
            .Columns(0).HeaderText = "Id"
            .Columns(1).HeaderText = "Titulo Álbum"
            .Columns(2).HeaderText = "Nome do Artista"
            'largura colunas
            .Columns(0).Width = 50
            .Columns(1).Width = 210
            .Columns(2).Width = 150
            'seleciona a linha inteira
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            'não permite seleção de multiplas linhas
            .MultiSelect = False
            ' exibe nulos formatados
            .DefaultCellStyle.NullValue = " - "
            'permite que o texto maior que célula não seja truncado
            .DefaultCellStyle.WrapMode = DataGridViewTriState.True
        End With
    End Sub

 

Executando o projeto e clicando no botão Exibir iremos obter o seguinte resultado:

2 - Localizando um artista e seus álbuns pelo código do artista

Vamos agora localizar um artista e seus álbuns pelo código do artista informado na caixa de texto código.

Para isso no evento Click do botão localizar que fica ao lado da caixa texto vamos incluir o seguinte código:

 Private Sub btnProcurar_Click(sender As Object, e As EventArgs) Handles btnProcurar.Click
        Using db = New ArteContexto()
            Dim codigo As Integer = Convert.ToInt32(txtId.Text)
            Dim _artistas = From a In db.Artistas
                                  Where a.ArtistaId = codigo
                                  Select a.ArtistaId, a.Nome
            dgvArtistas.DataSource = _artistas.ToList
            formataGridViewArtistas()
            Dim _albuns = From alb In db.Albuns
                                Where alb.ArtistaId = codigo
                                Select alb.AlbumId, alb.Titulo, alb.Artista.Nome
            dgvAlbuns.DataSource = _albuns.ToList
            formataGridViewAlbuns()
        End Using
    End Sub

Novamente estamos usando duas consultas LINQ, uma para retornar o artista pelo seu código e a outra para retornar os álbuns do mesmo artista também pelo seu código.

1- Localiza um artista pelo código

  Dim _artistas = From a In db.Artistas
                        Where a.ArtistaId = codigo
                       Select a.ArtistaId, a.Nome

2- Localiza os álbuns de um artista pelo código

   Dim _albuns = From alb In db.Albuns
                       Where alb.ArtistaId = codigo
                       Select alb.AlbumId, alb.Titulo, alb.Artista.Nome

Executando o projeto obtemos o seguinte resultado para o código do artista igual a 8:

3 - Localizando um artista pelo código a partir do DataGridView

Agora vamos localizar um artista usando o evento CellClick do controle DataGridView - gdvArtistas .

Basta o usuário clicar em uma linha do grid para que os dados do artista sejam exibidos nas caixas de texto Código e Nome.

Para isso digitamos o código a seguir no evento CellClick do controle DataGridView:

Private Sub dgvArtistas_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvArtistas.CellClick
        Try
            If dgvArtistas.Rows(e.RowIndex).Cells(0).Value <> Nothing Then
                Dim codigo As Integer = dgvArtistas.Rows(e.RowIndex).Cells(0).Value
                Try
                    Using ctx As New ArteContexto
                        Dim _artista = (From art In ctx.Artistas Where art.ArtistaId = codigo).SingleOrDefault
                        txtId.Text = _artista.ArtistaId
                        txtNome.Text = _artista.Nome
                    End Using
                Catch ex As Exception
                    MessageBox.Show("Erro " + ex.Message, "Erro::Localizar", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End Try
            End If
        Catch ex As Exception
            MessageBox.Show("Erro " & ex.Message)
        End Try
    End Sub

4 - Fazendo um Join com as tabelas Artistas e Albuns

Podemos obter as informações dos artistas e seus álbuns em uma única consulta LINQ fazendo um Join. Veja como fica o código da consulta LINQ:

   Private Sub btnExibir_Click(sender As Object, e As EventArgs) Handles btnExibir.Click
        Using db = New ArteContexto()

             Dim resultado = From art In db.Artistas
                                   Join alb In db.Albuns On art.ArtistaId Equals alb.ArtistaId
                                   Order By art.ArtistaId
                                   Select New With { _
                     		    .id = art.ArtistaId, _
		                 .nome = art.Nome, _
		                 .album = alb.Titulo _
                                   }
            dgvAlbuns.DataSource = resultado.ToList
            formataGridViewAlbuns()
        End Using
    End Sub

Executando essa consulta e exibindo o resultado no DataGridView - dgvAlbuns - temos :

4 - Removendo artistas e seus álbuns (RemoveRange)

Para remover artistas e seus álbuns vamos localizar o artista usar o método Remove(), localizar os álbuns do artista, e usar o método Remove() em um laço for/each  e a seguir chamar a o método SaveChanges() para confirmar a exclusão das informações. Veremos também como usar o novo método RemoveRange() para excluir uma coleção de entidades.

No evento Click do botão de comando Excluir vamos digitar o código a seguir:

Private Sub btnExcluir_Click(sender As Object, e As EventArgs) Handles btnExcluir.Click

        Using db = New ArteContexto()

           Try
                Dim codigo As Integer = Convert.ToInt32(txtId.Text)
             
  Dim _artista = db.Artistas.Single(Function(a) a.ArtistaId = codigo)
                db.Artistas.Remove(_artista)

                Dim _albuns = db.Albuns.Where(Function(alb) alb.ArtistaId = codigo)
                For Each album In _albuns
                    db.Albuns.Remove(album)
                Next

                db.SaveChanges()
                MessageBox.Show("Artista e seus albuns removidos com sucesso.")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Using

 End Sub

Executando o projeto e selecionando um artista, após pressionar o botão Excluir teremos o seguinte resultado:

Com a versão 6.01 do EntityFramework podemos usar o método RemoveRange() para remover uma coleção (IEnumerable) de entidades.

O código para o exemplo acima ficaria assim:

 Private Sub btnExcluir_Click(sender As Object, e As EventArgs) Handles btnExcluir.Click
        Using db = New ArteContexto()
            Try
                Dim codigo As Integer = Convert.ToInt32(txtId.Text)
                Dim _artista = db.Artistas.Single(Function(a) a.ArtistaId = codigo)
                db.Artistas.Remove(_artista)
                Dim _albuns = db.Albuns.Where(Function(alb) alb.ArtistaId = codigo)
                db.Albuns.RemoveRange(_albuns)
                db.SaveChanges()
                MessageBox.Show("Artista e seus albuns removidos com sucesso.")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Using
    End Sub

Substituímos o laço for/each pelo método  db.Albuns.RemoveRange(_albuns).

5 - Incluindo artistas e álbuns (AddRange)

Para incluir artistas e seus álbuns vamos usar o método Add do DBSet para incluir uma nova entidade Artista e novas entidades Album no contexto. Veremos também como usar o novo método AddRange() para incluir uma coleção de entidades.

 Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click
        Using db = New ArteContexto
             db.Artistas.Add(New Artista() With {.ArtistaId = 286, _
                                                 .Nome = "Macoratti", _
                                	  .Albuns = {New Album() With { _
                                              .AlbumId = 348, _
                                              .Titulo = "VB .NET o Retorno." _
                                           }, New Album() With { _
                                             .AlbumId = 349, _
                                             .Titulo = "Macoratti .net - Quase tudo para Visual Basic" _      
                            }} _
             })
            db.SaveChanges()
            MessageBox.Show("Artista e seus albuns incluídos com sucesso.", "Incluir",
MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Using
    End Sub

 

No código estamos incluindo um artista de código igual a 286 e dois álbuns, código 348 e 349.

Executando o projeto e clicando no botão Incluir. Para verificar a inclusão basta localizar o artista pelo seu código, no exemplo o código 286:

Vamos agora usar o método AddRange() para incluir um artista com código igual a 386 e dois álbuns com códigos 451 e 452.

   Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click
        Using db = New ArteContexto
            db.Artistas.Add(New Artista() With {.ArtistaId = 386, .Nome = "Teste"})
            Dim novosAlbuns As IList(Of Album) = New List(Of Album)()
            novosAlbuns.Add(New Album With {.AlbumId = 451, .Titulo = "Teste Album 1", .ArtistaId = 386})
            novosAlbuns.Add(New Album With {.AlbumId = 452, .Titulo = "Teste Album 2", .ArtistaId = 386})
            db.Albuns.AddRange(novosAlbuns)
            db.SaveChanges()
            MessageBox.Show("Artista e seus albuns incluídos com sucesso.", "Incluir", MessageBoxButtons.OK, 
MessageBoxIcon.Information)
        End Using
    End Sub

Executando o projeto e clicando no botão Incluir. Para verificar a inclusão basta localizar o artista pelo seu código, no exemplo o código 386:

Assim realizamos as principais recursos do Entity Framework 6.0 com o banco de dados PostGreSQL.

Pegue o projeto completo aqui: EF6_PostgreSQL.zip (sem as referências ao EF6)

João 3:16 Porque Deus amou o mundo de tal maneira que deu o seu Filho unigênito, para que todo aquele que nele crê não pereça, mas tenha a vida eterna.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti