Banco de Dados

14 fev, 2013

WPF – Acessando dados no SQL Server com Entity Framework

Publicidade

Hoje vou mostrar como criar uma aplicação WPF – Windows Presentation Foundation acessando dados do SQL Server, usando os recursos do Entity Framework. Vamos criar uma aplicação para cadastrar itens e links relacionados onde no nosso domínio iremos ter uma tabela para categorias e outra para itens no SQL Server.

Para abstrair o acesso aos dados, vamos usar o Entity Framework e gerar o mapeamento do objeto relacional entre as tabelas e os objetos do nosso domínio. Aplicando as boas práticas, vamos criar uma classe que atuará como a nossa camada de acesso a dados usando o contexto gerado pelo mapeamento OR/M.

Criando o projeto e definindo o modelo de dados

Vamos iniciar definindo o banco de dados e as tabelas usadas pela nossa aplicação no SQL Server. Podemos fazer isso de diversas formas, mas eu vou criar o banco de dados e as tabelas no próprio ambiente do Visual Basic 2010 Express, que será usado para criar a nossa aplicação WPF.

Abra o Visual Basic 2010 Express e crie um novo projeto (File-> New Project) do tipo WPF Application com o nome Wpf_Links. Agora abra a janela Database Explorer e clique com o botão direito do mouse sobre o item Data Connections. Na janela Add Connection vamos selecionar o Data source Microsoft SQL Server Database File e o nome Hiperlinks. Assim estaremos criando o banco de dados Hiperlinks -para isso clique no botão Sim na janela que informa que o arquivo não existe e pergunta se você deseja criá-lo:

wpf_acd11

Será exibido o banco de dados Hiperlinks na janela Database Explorer:

wpf_acd12

Vamos criar as tabelas clicando com o botão direito do mouse sobre o item Tables e, a seguir, em Add New Table. Vamos iniciar com a tabela Categorias definindo a sua estrutura conforme abaixo:

wpf_acd15

A seguir, vamos criar a tabela Itens com a seguinte estrutura:

wpf_acd16

Vamos definir o relacionamento entre as duas tabelas conforme mostra a figura abaixo, onde temos um relacionamento entre o campo categoriaid da tabela Categorias e o campo categoriaid da tabela Itens:

wpf_acd17

Definindo o relacionamento OR/M com o Entity Framework

Vamos definir agora o mapeamento OR/M usando o Entity Framework. Selecione o menu Project, clique em Add New Item e a seguir escolha o template Entity Data Model:

  • Informe o nome Hiperlink.edmx e clique Add;
  • Selecione a opção Generate From database e clique em Next>;
  • Selecione o banco de dados Hiperlinks.mdf aceite as configurações padrão e clique em Next>;
  • Na janela de diálogo que solicita a confirmação para copiar o arquivo para o seu projeto clique em Não;
  • Selecione as tabelas Categorias e Itens e marque a opção Pluralize or singularize generated object names e clique em Finish.

Será gerado o mapeamento OR/M e as entidades Categoria e Item que representam as tabelas Categorias e Itens.

Temos também a criação do contexto HiperliknkEntities, que representa o nosso modelo de domínio de entidades que iremos usar para acessar as entidades do nosso domínio:

wpf_acd18

Criando a classe de acesso a dados

Vamos definir a nossa camada de acesso a dados criando uma classe no projeto com o nome DALHiperlink.vb e definindo nesta classe alguns métodos para acessar e persistir informações das entidades.

No menu Project, clique em Add Class e informe o nome DALHiperlink.vb e a seguir defina o código abaixo nesta classe:

Imports System.Linq
Imports System.Collections

Public Class DALHiperlink

    Public Shared Function getDados(ByVal topico As String) As IEnumerable
        Dim contexto As New HiperlinksEntities()
        Dim resultado = From itm In contexto.Itens
                                Join cat In contexto.Categorias
                                On itm.categoriaid Equals cat.categoriaid
                                Where (itm.topico.StartsWith(topico))
                                Select itm
        Return resultado

    End Function

    Public Shared Function getCategoria() As IList
        Dim contexto As New HiperlinksEntities()
        Return contexto.Categorias.[Select](Function(x) x.descricao).ToList()
    End Function

    Public Shared Function getTopicos(ByVal descricao As String) As IList
        Dim context As New HiperlinksEntities()
        Dim resultado = (From itm In context.Itens
                                Join cat In context.Categorias
                                On itm.categoriaid Equals cat.categoriaid
                                Where cat.descricao = descricao
                                Select itm.topico).ToList()
        Return resultado
    End Function

    Public Shared Sub incluirDados(ByVal topico As String, ByVal endereco As String, ByVal Maincategory As String)
        Dim contexto As New HiperlinksEntities()
        Dim nEntidade = New Item()
        nEntidade.topico = topico
        nEntidade.link = endereco
        nEntidade.categoriaid = contexto.Categorias.Where(Function(x) x.descricao = Maincategory).[Select](Function(x) x.categoriaid).First()
        contexto.AddObject("Itens", nEntidade)
        contexto.SaveChanges()
    End Sub

    Public Shared Sub incluirCategoria(ByVal descricao As String)
        Dim context As New HiperlinksEntities()
        Dim nEntidade = New Categoria()
        nEntidade.descricao = descricao
        context.AddObject("Categorias", nEntidade)
        context.SaveChanges()
    End Sub

End Class

Nesta classe temos os seguintes métodos estáticos(Shared):

  • getDados – retorna um registro da tabela itens com base no critério do tópico informado;
  • getCategoria – retorna a relação de categorias;
  • getTopicos – retorna um tópico com base em sua descrição;
  • incluirDados – inclui dados na tabela Itens;
  • incluirCategoria – incluir dados na tabela Categoria.

Estamos usando o LINQ to Entities para consultar as entidades; o método AddObject e o método SaveChanges para incluir e persistir as informações das entidades.

Na próxima parte do artigo vamos definir a interface com o usuário e usar a classe de acesso a dados para gerenciar as informações das nossas entidades.