Usando SQL Server Compact Edition 3.5 e LINQ To SQL


Não sei se você percebeu mas com o advento da nova versão da plataforma .NET , do Visual Studio e mesmo nas versões Express temos a disposição o SQL Server Compact Edition 3.5.

Por padrão o SQL Server Compact 3.5 é instalado para todas as versões do Visual Studio e esta disponível no ambiente de desenvolvimento local para uso com o LINQ to SQL.

Mas a distribuição de uma aplicação que usa o SQL Server e LINQ To SQL é um pouco diferente; como o SQL Server Compact 3.5 não é parte do framework .NET ele precisa ser empacotado com a aplicação ou baixado separadamente do site da Microsoft.

Para detalhes sobre o assunto veja o meu artigo  : Usando SQL Server Compact 3.5

Como você já deve saber  o LINQ To SQL é uma ferramenta que permite realizar o mapeamento objeto relacional entre as tabelas de um banco de dados SQL Server e o modelo e objetos do seu projeto. Será que podemos usar o LINQ to SQL com o SQL Server Compact 3.5 ?

Eu vou criar um novo projeto do tipo WIndows Forms Application usando o Visual Basic 2008 Express Edition chamado Linq_SqlCE;

Na janela DataSource vou clicar no link Add New Data Source para criar uma conexão com o banco de dados Northwind.sdf conforme descrito a seguir:

A seguir clique em Next> e verifique o nome do arquivo e a string de conexão. Clique em Next>

Clique em Next> e na próxima janela selecione as tabelas Categories e Products aceitando o nome padrão NorthwindDataSet e clique no botão Finish;

Agora clique com o botão direito do mouse sobre o nome do projeto e selecione Add New Item;

Na janela a seguir selecione LINQ To SQL classes e informe o nome NorthwindCE.dbml e clique em Add;

Neste momento já temos na janela DataSources a conexão exibindo as tabelas selecionadas e o descritor  LINQ to SQL aberto.

A princípio teríamos apenas que selecionar as tabelas e arrastar e soltar no Descritor LINQ para gerar o datacontext e o mapeamento OR/M com as tabelas.

Certo ?

Errado !!! 

Se você tentar arrastar e soltar as tabelas para o descrito LINQ não vai conseguir....

Infelizmente , o provedor SSCE não é suportado pelo descritos LINQ to SQL (por enquanto...).

Então não tem jeito ???

Tem jeito sim , vejamos como contornar o problema usando a ferramenta de linha de comando SQLMetal.

O LINQ to SQL possui um ferramenta a nível de linha de comando chamada SQL Metal que permite gerar classes de entidades, propriedades e associações de forma automática. É mais uma opção visto que você pode obter o mesmo resultado usando o Editor Visual do LINQ ou via código.

A localização padrão do SQLMetal é : \Programa Arquivos\Microsoft SDKs\Windows\vn.nn\Bin

Para maiores detalhes sobre a ferramenta leia o meu artigo :  LINQ - SQLMetal

Vamos excluir o dataset criado e o arquivo .dbml gerado pelo descritor e vamos executar a ferramenta de linha de comando SQLMetal.exe sobre o banco de dados Northwind.sdf  conforme a figura abaixo:

Note: que o meu banco de dados esta localizado na pasta c:\dados.

Os parâmetros que eu usei na execução da linha de comando foram:

O significado de cada um dos parâmetros que podem ser usados é visto na tabela abaixo:

 Opção Descrição
 /server:<name>    Representa o nome do SQL Server com o qual é feita a conexão
 /database:<name>    Representa o nome do banco de dados usado para gerar a classes de entidades
 /user:<name> Representa o nome do usuário usado para efetuar a conexão
 /password:<name> Representa a senha do usuário usado para efetuar a conexão
 /conn:connectionString Permite definir uma string de conexão com o banco de dados
 /timeout:<value> Permite definir o timeout (em segundos) para o usuário para cada comando
 /views Obtêm as views do banco de dados
 /sprocs Obtêm as funções do usuário do banco de dados
 /dbml:<filename> Permite definir um nome de arquivo dbml que conterá os metadados do banco de dados
e informação sobre classes e propriedades
 /code:<filename> Permite definir o nome do arquivo que conterá as classes de entidades e o data context
 /map:<filename> Obtêm um arquivo XML externo com atributos de mapeamento. As entidades produzidas
no código não conterão classes e declaração de atributos de propriedades visto que elas
são incluídas no arquivo de mapeamento XML
 /language:<name> Existem duas opções: C# ( o padrão ) e VB.
 /namespace Permite definir o namespace que irá conter as classes de entidades geradas
 /context:<name> Você pode definir o nome da classe derivada pela classe DataContext.
 /entitybaet:<name> Você pode indicar o nome da classe de entidade base a partir da qual outras entidades
irão herdar
 /pluralize Obtêm a classe de entidade e nomes das propriedades
 /serialization:<name> Gera classes serializáveis. Valores possíveis: None e Undirecional.
 /provider:<name> Permite definir o nome do provedor a ser usado para conectar com o banco de dados
valores possíveis: SQLCompact, SQL2000 e SQL2005

Com isso teremos o arquivo de mapeamento objeto relacional NorthwindCE.dbml gerado.

Em seguida vamos importar o arquivo .dbml gerado pela ferramenta para o nosso projeto clicando com o botão direito do mouse sobre o nome do projeto e selecionando Add Existing Item;

Após este passo já podemos abrir o arquivo NorthwindCE.dbml gerado:

Podemos ver também os arquivos contendo o código que realiza o mapeamento para as tabelas do banco de dados Northwind.sdf;

Agora só falta usar o mapeamento gerado e mostrar que realmente funciona. Inclua um controle DataGridView  e um controle MenuStrip no formulário padrão form1.vb;

A seguir no evento Click do Menu Carregar inclua o código abaixo:

Private Sub CarregarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CarregarToolStripMenuItem.Click

    Dim db As NorthwindCE.DataAccess.NorthwindCE = New NorthwindCE.DataAccess.NorthwindCE("c:\dados\Northwind.sdf")

    DataGridView1.DataSource = From produtos In db.Products

End Sub

Na primeira linha eu estou criando uma instância do DataContext para poder ter acesso a coleção de objeto mapeada pela ferramenta SQLMetal. ( Lembre-se que  NorthwindCE.DataAccess foi o namespace que criamos quando usamos a ferramenta.)

A seguir estou acessando todos os dados da tabela Products do banco de dados Northwind.sdf.

Agora execute o projeto(F5) e clique no menu Carregar:

Pronto temos exibido no DataGridView os dados da tabela Products usando o LINQ com o SQL Server Compact 3.5, onde o mapeamento foi gerado pela ferramenta SQLMetal e acessada no descritor LINQ do projeto.

Eu sei é apenas LINQ mas eu gosto...

Referencias:


José Carlos Macoratti