Esse artigo faz parte da revista .NET Magazine edição 50. Clique aqui para ler todos os artigos desta edição

">

O WPF (Windows Presentation Foundation) é uma das grandes novidades existentes nas versões 3.0 e 3.5 da plataforma .NET Framework. Na versão 2005 do Visual Studio nós já podíamos utilizar o WPF mediante a instalação de um pacote. Agora, na versão 2008 do Visual Studio já podemos desenvolver aplicações WPF com recursos nativos, possibilitando o desenvolvimento de uma camada de apresentação de altíssima qualidade para as nossas aplicações.

Nesta mesma vertente de novidades temos o LINQ, tema preferido dos atuais artigos, palestras e vídeo-aulas que vemos por aí. O LINQ (Language Integrated Query) é o grande astro do .NET Framework 3.5,  e com ele temos uma nova e melhorada forma de acessar os dados das nossas aplicações. Para os usuários do SQL Server, temos o LINQ to SQL, que é uma ótima ferramenta de mapeamento Objeto-Relacional (O/RM).

Essas duas tecnologias são o que temos de mais novo na plataforma Microsoft para o desenvolvimento de aplicações. Porém, temos pouquíssimos exemplos que nos mostram estas duas tecnologias trabalhando em conjunto.

É com base nisso que iremos desenvolver uma “Agenda de Contatos”. Apesar de ser uma aplicação bem simples, poderemos ver neste artigo todos os passos necessários para criar uma aplicação com WPF utilizando o LINQ to SQL como camada de acesso a dados.

Um resumo do que o WPF é capaz

Qualquer aplicação que você crie com o uso do WPF, será composta de um conjunto de páginas ou janelas XAML (eXtensible Application Markup Language) e o código gerenciado relacionado (code-behind).

Porém, como sabemos, as funcionalidades que um conjunto de páginas oferece são bem limitadas. São os conhecidos problemas que temos em aplicações Web, como a preservação do estado da página entre os posts, a passagem de dados entre as páginas da mesma aplicação, o gerenciamento de variáveis de nível global, entre outros problemas que assombram os programadores Web há algum tempo.

Entretanto o WPF vai um pouco, além disso, com ele podemos criar o nosso conjunto de páginas em uma aplicação de uma maneira mais tradicional, como é o caso das aplicações Windows Forms. Pensando dessa forma, uma página XAML é como se fosse um Form de um Windows Application.

Sendo assim, enquanto uma aplicação Windows Forms coloca em um executável um conjunto de Forms, uma aplicação WPF coloca em um mesmo executável um conjunto de páginas/janelas XAML.

Também não podemos esquecer que é possível criar três tipos de aplicações possíveis com o uso do WPF / XAML. Temos as aplicações Standalone, que são como aplicações Windows Forms que rodam em janelas do Windows.

Temos as aplicações XBAPs (XAML Browser Applications) que rodam no browser, porém apenas dentro da plataforma Microsoft. Para as aplicações XBAPs o usuário precisa ter o .NET Framework  instalado em seu computador.

E por fim temos o Silverlight, que também são aplicações desenvolvidas com XAML, porém rodam em outras plataformas que não a da Microsoft, e em um número maior de browsers. Os usuários destas aplicações precisam apenas instalar o Silverlight em seus computadores.

Maiores detalhes sobre estes três tipos de aplicações criadas com WPF, você encontra nesta mesma edição, na coluna Quick Update. Nos exemplos deste artigo iremos criar uma aplicação WPF Standalone, ou seja, que irá rodar em janelas do Windows.

Relembrando como o LINQ funciona

Eu duvido que você ainda não tenha ouvido ou lido nada sobre o LINQ. Portanto eu não irei perder muito tempo detalhando o que estas quatro letras significam. De uma forma bem prática e simples podemos dizer que o LINQ é uma nova linguagem que oferece suporte à consulta de dados, que podem estar armazenados nas mais diversas formas possíveis.

Os dados a serem consultados podem estar em XML (LINQ para XML), Banco de dados diversos (LINQ-enabled ADO.NET, que incluí LINQ to SQL, LINQ to DataSet e LINQ to Entities) e Objetos (LINQ to Objects). Ou seja, podemos realizar consultas a estas e outras fontes de dados, através de uma linguagem fortemente tipada, como é o LINQ.

Sendo assim utilizaremos o LINQ to SQL em nossa aplicação, para acessar obviamente um banco de dados de um SQL Server 2005.

Banco de Dados

Uma boa maneira de se começar o desenvolvimento de uma aplicação é através da criação do seu Banco de Dados. Como já foi dito iremos criar uma pequena e simples agenda de contatos. Para isso vamos utilizar uma database com apenas duas tabelas. Tabela Relations onde iremos definir os tipos de relações que os nossos contatos possuem conosco, e a tabela Contacts, onde de fato iremos cadastrar os nossos contatos.Comece, portanto abrindo o SQL Server 2005, que você também pode utilizar na versão Express, é claro.

Nota do DevMan

O SQL Server 2005 Express é a versão gratuita do gerenciador de banco de dados da Microsoft. Você pode fazer o download do SQL Server Express diretamente do site da Microsoft, através deste link:

http://www.microsoft.com/downloads/

details.aspx?FamilyID=31711d5d-725c-4afa-9d65-e4465cdff1e7&displaylang=en

Este link indicado acima irá realizar o download do instalador do Engine do SQL Server 2005 Express. Você também pode baixar o instalador da interface gráfica para trabalhar com o Express, chamado SQL Server Management Studio Express. Você encontra esse download no seguinte link:

http://www.microsoft.com/downloads/

details.aspx?FamilyID=6053c6f8-82c8-479c-b25b-9aca13141c9e&displaylang=en

Muita gente utiliza a versão Express do SQL Server 2005, principalmente em máquinas de desenvolvimento, e até em aplicações de pequeno porte. Porém, o SQL Server Express 2005 possui as seguintes limitações:

- Suporte a um único Processador

- Limite de apenas 1GB de RAM. Se o seu servidor possuir mais do que isso, o SQL Server Express vai reconhecer e utilizar apenas 1GB

- Limite do tamanho das Databases em 4GB.

Essas limitações não nos impedem de trabalhar com o SQL Server Express em aplicações de pequeno porte, porém é importante fazer uma avaliação da expectativa de crescimento do seu banco.

Veja um relatório completo de comparações entre todas as edições do SQL Server 2005, neste link:

http://www.microsoft.com/sql/prodinfo

/features/compare-features.mspx

Com o SQL Server 2005 aberto (através do aplicativo Server Management Studio) crie um novo database clicando com o botão direito sobre a pasta Databases e escolhendo a opção New Database, neste exemplo o nome do banco de dados é WPF_Contacts.

Em seguida crie as tabelas deste banco. Veja na Figura 1 um diagrama que mostra a estrutura das duas tabelas que precisamos, e também o relacionamento entre elas.

Note que as duas tabelas utilizam como chave primária um campo chamado ID com o tipo uniqueidentifier. Este tipo de campo do SQL Server é equivalente à classe Guid do .NET Framework.

Figura 1. Estrutura e relacionamento das tabelas Contacts e Relations

Quando vamos trabalhar com uma ferramenta de O/RM (Mapeamento Objeto/Relacional), como é o caso do LINQ to SQL, é importante que as chaves primárias das tabelas sejam de um único campo, e que este campo tenha um tipo equivalente ao GUID.

Veja também que a tabela de Relations é muito simples e servirá apenas de qualificador para os nossos contatos. No nosso exemplo ela terá um papel importante, para podermos ver como trabalhar com relacionamentos no LINQ to SQL. Na Listagem 1 você encontra um script para a criação destas duas tabelas e seu relacionamento.

Listagem 1. Script para a criação das tabelas no database WPF_Contacts

USE [WPF_Contacts]

GO

/****** Object:  Table [dbo].[Contacts]    Script Date: 02/28/2008 15:44:44 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[Contacts](

        [ID] [uniqueidentifier] NOT NULL,

        [Name] [varchar](50) NOT NULL,

        [Phone] [varchar](15) NULL,

        [Address] [varchar](50) NULL,

        [City] [varchar](50) NULL,

        [State] [varchar](50) NULL,

        [Email] [varchar](100) NULL,

        [RelationID] [uniqueidentifier] NOT NULL,

CONSTRAINT [PK_Contacts] PRIMARY KEY CLUSTERED

(

        [ID] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

...

Quer ler esse conteúdo completo? Tenha acesso completo