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:
Será exibido o banco de dados Hiperlinks na janela Database Explorer:
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:
A seguir, vamos criar a tabela Itens com a seguinte estrutura:
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:
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:
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.