ASP .NET - Acessando MySQL com Entity Framework via padrão Repository e exibindo os dados no GridView (VB .NET) - I


Neste artigo vou criar uma aplicação ASP .NET Web Forms que exibe informações em um controle GridView obtidas de uma base de dados MySQL via Entity Framework usando o padrão Repository.

Para poder usar os recursos do Entity Framework, como o Entity Data Model, usando uma base de dados MySql você tem que instalar o MySQL for Visual Studio.

A instalação irá preparar o ambiente instalando e atualizando os componentes necessários para integrar o Visual Studio com o MySql e assim poderemos usar os recursos do Entity Framework.

Então se você já tem o MySQL instalado e já tentou usar o Entity Framework para gerar as entidades a partir do MySQL e não conseguiu ainda, faça a instalação do MySql for Visual Studio.

Ao final do processo o MySql Installer irá apresentar os recursos instalados/atualizados :

No nosso exemplo vamos acessar o banco de dados Vendas e a tabela produtos do MySQL:

O objetivo da nossa aplicação deverá acessar o MySql e obter informações da tabela exibindo-as em um controle GridView em um projeto ASP .NET Web Forms.

Vamos então ao trabalho...

Os recursos usados :

Criando o projeto ASP .NET Web Forms no Visual Studio 2015

Abra o VS 2015 Community e crie um novo projeto (File-> New Project);

Selecione a linguagem Visual Basic -> Web  e o template ASP .NET Web Application ;

Informe o nome GridView_Tooltip e clique no botão OK;

Escolha a opção Empty e marque Web Forms  e não marque mais nada de forma a criar uma aplicação ASP .NET Web Forms totalmente vazia.

No menu Project clique em Add New Item e selecione o template Web Form e informe o nome Default.aspx e clique em Add;

Definindo o modelo de entidades via Entity Framework

No menu Project clique em New Folder e informe o nome Model para criar a pasta no projeto.

Clique com o botão direito do mouse sobre a pasta Model e a seguir em Add -> New Item;

Selecione o item Data e o template ADO .NET Entity Data Model, informe o nome VendasModel e clique no botão Add;

Selecione a opção EF Designer from database pois vamos criar o modelo de entidades a partir de um banco de dados existente no MySql:

Clique no botão Next>;

Na próxima janela do assistente clique no botão New Connection para abrir a janela de conexões e assim podermos selecionar o banco de dados;

Na janela Connection Properties clique no botão Change para selecionar outro banco de dados;

A janela Change Data Source deve apresentar a opção MySQL DataBase. Se a opção não aparecer então houve problemas na instalação do pacote para configurar o ambiente.

Selecione MySQL DataBase e clique em OK;

A seguir informe o nome do seu servidor MySQL , o usuário e a senha;

Selecione a seguir o banco de dados que deseja usar:  Vendas.

E clique no botão OK;

A seguir marque a opção para incluir as informações da string de conexão e clique no botão Next>;

 

Para concluir selecione a tabela (ou tabelas) que deseja usar. Eu vou usar a tabela produtos;

Para concluir clique no botão Finish;

Será criado modelo de entidades mapeando a tabela produtos para as entidades geradas na pasta Model:

Assim temos o modelo de entidades e vamos criar um repositório para centralizar a lógica de acesso a dados.

Criando o Repositório

No menu Project clique em New Folder e informe o nome Repositorio para criar a pasta no projeto.

No menu Project clique em Add New Item e selecione o template Interface e informe o nome IRepositorio.vb

O que é uma interface ?

Uma interface, no paradigma da orientação a objetos, é  um tipo de classe que contém apenas as assinaturas de métodos, propriedades, eventos e indexadores.

A implementação dos membros é feita por uma classe concreta ou struct que implementa a interface.

A seguir vamos definir o código abaixo neste arquivo:

Imports System.Linq.Expressions
Public Interface IRepositorio(Of T As Class)
    Function GetTodos() As IQueryable(Of T)
    Function GetPorId(predicate As Expression(Of Func(Of T, Boolean))) As IQueryable(Of T)
End Interface

Nesta interface definimos dois métodos que deverão ser implementados:

1- Note que estamos usamos o namespace using System.Linq.Expressions que contém classes e enumerações que permitem representar expressões de código no nível da linguagem como objetos na forma de árvores de expressões;

2- Na assinatura da classe estamos declarando  Public Interface IRepositorio(Of T As Class)  ; aqui T é uma classe;

3- Function GetTodos() As IQueryable(Of T) - Este método retorna todos os dados como IQueryable; dessa forma podemos retornar a lista e aplicar expressões lambdas para filtrar e classificar os dados;

4- Function GetPorId(predicate As Expression(Of Func(Of T, Boolean))) As IQueryable(Of T) - Retorna os dados que atendem o critério informado em tempo de execução via expressão lambada. Estamos usando o delegate Func, e aplicando o predicate para verificar se o dado atende o critério (retorna true ou false);

Observe que não temos nenhum comando SQL, nenhuma declaração de objetos ADO .NET como connection, command, dataset, datareader, etc.

Já temos o contrato definido e agora vamos definir a classe que irá implementar esse contrato.

Implementando a interface IRepositorio na classe Repositorio

Vamos então criar uma classe chamada Repositorio  na pasta Repositorio que irá implementar a nossa interface.

Então selecione a pasta Repositorio no menu Project clique em Add New Item;

Selecione o template Class, informe o nome Repositorio.vb e clique no botão Add;

Vamos definir a assinatura da classe Repositorio conforme o código abaixo:

Public Class Repositorio(Of T As Class)
    
Implements IRepositorio(Of T)
     Implements
IDisposable

Note que estamos implementando a interface IRepositorio(Of T) e a interface IDisposable(Of T).

A seguir vemos o código dessa implementação:

Imports System.Linq.Expressions
Public Class Repositorio(Of T As Class)
    Implements IRepositorio(Of T)
    Implements IDisposable
    Private Context As vendasEntities
    Protected Sub New()
        Context = New vendasEntities()
    End Sub
    Private Function IRepositorio_GetTodos() As IQueryable(Of T) Implements IRepositorio(Of T).GetTodos
        Return Context.Set(Of T)()
    End Function
    Private Function IRepositorio_GetPorId(predicate As Expression(Of Func(Of T, Boolean))) As IQueryable(Of T) Implements IRepositorio(Of T).GetPorId
        Return Context.Set(Of T)().Where(predicate)
    End Function
    Private Sub IDisposable_Dispose() Implements IDisposable.Dispose
        If Context IsNot Nothing Then
            Context.Dispose()
        End If
        GC.SuppressFinalize(Me)
    End Sub

End Class

Agora vamos detalhar e entender cada método implementado.

    Private Context As vendasEntities

    Protected Sub New()
        Context = New vendasEntities()
    End Sub

Aqui estamos referenciando o contexto representando por vendasEntities na variável Context e criando uma nova instância do contexto. Tudo depende do contexto e vamos usar sua referência em todos os métodos para acessar as entidades no Entity Data Model.

Private Function IRepositorio_GetTodos() As IQueryable(Of T) Implements IRepositorio(Of T).GetTodos

        Return Context.Set(Of T)()

End Function

O método GetTodos() recebe uma entidade (uma classe) e retorna um IQueryable,  ou seja uma lista completa das entidades. (Aqui o método Set(Of T) do contexto retorna uma instância DbSet(Of T) para o acesso a entidades de determinado tipo no contexto.)

Para entender melhor o IQueryable veja o meu artigo :  .NET - Comparando IEnumerable com IQueryable.

Private Function IRepositorio_GetPorId(predicate As Expression(Of Func(Of T, Boolean))) As IQueryable(Of T) Implements IRepositorio(Of T).GetPorId

        Return Context.Set(Of T)().Where(predicate)
End Function

O método GetPorId() usa um delegate Func(Of T) como parâmetro de entrada, onde será usada uma expressão lambda (Ex: p => p.produtoId == Id) como critério, e, um predicate para validar o critério usando a cláusula Where. O retorno será uma lista IQueryable.

Para entender melhor o delegate Func() veja o meu artigo: C# - Apresentando o delegate Func

Na próxima parte do artigo vamos definir a nossa camada de acesso a dados e a camada de negócios.

E disse-lhe Jesus: Eu vim a este mundo para juízo, a fim de que os que não vêem vejam, e os que vêem sejam cegos.
João 9:39

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti