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 _albuns = db.Albuns.Where(Function(alb)
alb.ArtistaId = codigo)
db.SaveChanges() 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: