ASP .NET 2008 - Usando o componente LinqDataSource


E lá vou eu novamente falar sobre o LINQ , veja meus artigos anteriores sobre o assunto nos links abaixo:

Este artigo falar mostrar como acessar e manter dados em uma página ASP .NET com LINQ To SQL via componente LinqDataSource.

Vamos acessar os dados do banco de dados Northwind.mdf exibindo-os em um controle GridView com opções para edição , alteração e inclusão de dados usando LINQ To SQL através do componente LinqDataSource.

Para construir o exemplo usado neste artigo eu vou usar o Visual Web Developer 2008 Express, o SQL Server 2005 Express e o banco de dados Northwind.mdf. Estes recursos você pode baixar gratuitamente nos links abaixo:

Instalação via Web:

Abra o Visual Web Developer 2008 Express (VWD 2008E) e no menu File selecione o item New Web Site; a seguir selecione o template ASP .NET Web Site, Location File System , language Visual Basic e informe o nome do site : uLinqDataSource

Vamos incluir uma referência ao LINQ To SQL. No menu WebSite selecione Add new Item e na janela Templates selecione LINQ To SQl Classes informando o nome Northwind.dbml pois iremos acessar o banco de dados Northwind.mdf. Com isso estamos criando o DataContext que é o objeto que gerencia o acesso aos dados sendo também o responsável por traduzir as alterações realizadas nos objetos e refleti-las para o banco de dados via SQL e vice-versa.

Neste momento será apresentada a janela de aviso abaixo solicitando a confirmação para incluir o arquivo .dbml na pasta App_Code. Confirme.

A seguir vamos definir uma conexão com o banco de dados Northwind.mdf; se a conexão ainda não existir no seu ambiente faça o seguinte:

1- No menu View e selecione DataBase Explorer e clique com o botão direito do  mouse sobre o item Data Connections e selecione Add Connection...

2- Na janela Add Connection Clique no botão Browse e selecione o banco de dados Northwind.mdf a partir do local onde você o instalou e clique no botão Abrir;

Será apresenta a janela de aviso abaixo solicitando a confirmação para copiar o arquivo para a pasta App_Data no seu projeto. Confirme.

Abra a janela DataBase Explorer e expanda os objetos do banco de dados. Selecione todas as tabelas e arraste e solte na janela do Descritor Objeto Relacional. O descritor irá criar as classes mapeadas para cada tabela do banco de dados e você verá o esquema das classes conforme figura a seguir;

Note que o descritor LINQ To SQL cria as classes a partir das tabelas. Assim a tabela Products resultou na classe Product e a tabela Categories na tabela Category. Estes nomes tornam o seu modelo consistente com a convenção usada pelo framework .NET e são convenientes na maioria dos casos.

Se você não gostar dos nomes dados às classes ou às propriedades mapeadas que o descritor gerou você pode alterá-los editando diretamente o nome da entidade/propriedade no próprio descritor ou via janela de propriedades.

Quando você arrasta e solta as tabelas Categories e Products a partir da janela DataBase Explorer no descritor LINQ To SQL, o VWD 2008 irá inspecionar os relacionamentos chave primária/chave estrangeira dos objetos e baseado neles irá criar associações de relacionamentos padrão entre as diferentes entidades de classes criadas.

Para o caso acima o descritor verifica que existe um relacionamento um-para-muitos entre os objetos e isso é expresso pela seta entre a classe Category e a classe Product no descritor. A direção da seta na interface do descritor indica se a associação é um relacionamento do tipo um-para-um ou um-para-muitos.

Perceba que a nova versão apresenta mais uma forma de visualização no descritor. Selecionando Split você terá uma visão do código fonte e do Design simultânea onde qualquer alteração em um deles será refletida imediatamente no outro.

A partir da janela ToolBox selecione a guia Data e arraste um componente GridView para a página Default.aspx e selecione na opção Choose Data Source o item <New data source...>

Será aberta janela do assistente de configuração para Data Source. Neste momento iremos selecionar o componente LINQ e aceitar o nome padrão : LinqDataSource1.

Selecione a seguir o DataContext com qual iremos trabalhar e que foi criado quando referenciamos o LINQ To SQL. O nome padrão exibido será : NorthwindDataContext. Clique em Next>

Na janela Configure Data Selection selecione a tabela Products, marque todos os campos e clique no botão Next>

Para permitir o recurso de alteração, exclusão e inclusão automática pelo componente LinqDataSource clique no botão Advanced e marque as opções conforme a figura abaixo. Clique no botão Finish.

Ao final você verá o GridView na página Default.aspx exibindo todos os campos da tabela Products.

Selecione o GridView e em GridView Tasks marque as opções habilitando paginação, ordenação, edição e exclusão.

Vamos rodar o projeto pressionando F5. Deveremos obter a página exibindo os campos da tabela Products com opção para Editar e Excluir dados.

Se você der uma espiada no código fonte da página irá observar a utilização do componente LinqDataSource1 e do objeto DataContext -NorthwindDataContext.

<asp:LinqDataSource ID="LinqDataSource1" runat="server"   ContextTypeName="NorthwindDataContext" EnableDelete="True" EnableInsert="True"  
................................
</asp:LinqDataSource>

Selecione o GridView e em GridView Tasks e clique em Edit Columns e a seguir remova algumas colunas da tabela para tornar mais fácil a visualização no GridView, deixe somente as colunas: ProductID, ProductName, SupplerID, CategoryID, UntiPrice, UnitInStock e QuantityPerUnit. Para remover os campos , selecione o campo desejado e clique no botão

Se você já usou o componente ObjectDataSource antes e passou parâmetros explicitamente para métodos Update sabe que terá que alterar a assinatura dos métodos update dos TableAdapter se os parâmetros passados pela interface forem modificados, assim , se você deletar uma coluna no seu grid terá que modificar o TableAdapter para suportar os métodos update sem aquele parâmetro.

Usando <asp:LinqDataSource> não você não precisa fazer nada disso, basta deletar , ou incluir uma coluna na interface e rodar a aplicação novamente, o que torna a utilização do LinqDataSource mais simples.

Ao final deveremos ver no GridView as colunas conforme figura a seguir:

No GridView estamos exibindo a chave primária para os campos Supplier e Category de cada produto o que , do ponto do vista do usuário, não é nada amigável. Por que não exibir o nome da categoria e o nome do fornecedor ao invés do código ? Além disso podemos incluir um dropdownlist para que no modo de edição o usuário possa escolher entre os valores disponíveis na base de dados.

Podemos fazer essas alterações no GridView permitindo a exibição do nome da categoria e do nome do fornecedor ao invés de seus código substituindo o campo do tipo BoundField para TemplateField. Fazendo isso podemos incluir qualquer conteúdo para customizar a exibição final da coluna.

Para alterar o tipo para TemplateField no GridView clique em Edit Fields , e, janela Fields selecione os campos e clique no link Convert this field into a TemplateField.

Para exibir o nome da categoria e nome do fornecedor ao invés do seu código vamos recorrer ao recurso do LINQ pois a classe Product no modelo de objetos do LINQ To SQL possui um propriedade Supplier e Category através das quais podemos vincular as propriedades Supplier.CompanyName e Category.CategoryName acessando as informações na classe Category e Supplier e exibindo-as no gridview.

Basta clicar na opção EditTemplates do GridView e efetuar a alteração para os templates conforme a figura abaixo:

Com isso passamos a exibir os nomes da categoria e do fornecedor:

Vamos filtrar a exibição dos dados no GridView por Categoria incluindo um componente DropDownList na página Defaut.aspx .

A seguir na guia DropDownList Tasks clique na opão Choose data Source...

Na janela Choose a DataSource clique em <New Data Source...>

Na janela para escolher um tipo de Data Source selecione LINQ e informe o nome CategoryDataSource;

Agora escolha o DataContext que criarmos no inicio do artigo: NorthwindDataContext;

Selecione a tabela Categories e os campos CategoryID e CategoryName e clique no botão Finish;

Na próxima janela defina o campo que deve ser exibido no controle como CategoryName e o campo que será usado quando um item for selecionado como CategoryID;

Agora só falta alterarmos a configuração do LinqDataSource1 atribuído ao GridView. Clique no componente LinqDataSource1 e selecione configure Data Source , a seguir inclua uma condição clicando no botão Where ;

Na janela para configurar a expressão Where defina o critério para filtrar os dados pelo campo CategoryID usando um parâmetro definido como @CategoryID cujo valor virá do controle DropDownList1 quando o mesmo for selecionado. E clique no botão Add;

Execute o projeto pressionando F5. Você verá o controle DropDownList exibindo a relação de categorias e ao selecionar a categoria os dados no gridView serão filtrados exibindo os produtos daquela categoria.

Como podemos ver na figura acima temos também em funcionamento as opções para Editar e Deletar um registro da tabela.

O que é importante frisar neste momento é que quando você define o modelo de objetos usando LINQ To SQL temos de forma automática refletido no modelo de classe as restrições dos relacionamentos das tabelas do banco de dados o que permite efetuar validações. Então se você tentar incluir um valor nulo para uma coluna onde um valor é requerido ou atribuir uma string a um campo inteiro ou atribuir uma chave estrangeira a uma linha que não existe, o modelo de dados do LINQ To SQL terá condições de detectar o erro e disparar uma exceção de forma manter a integridade dos dados.

Como acabamos de mostrar o LINQ To SQL fornece diversos novos recursos que devem ser considerados com atenção no desenvolvimento de aplicações ASP .NET que usam acesso a dados. Lembre-se sempre que o bom senso é a melhor arma contra efeitos colaterais que podem impactar a sua aplicação em produção visto que mesmo sendo um recurso poderoso o LINQ é mais uma camada que será agregada a sua aplicação e, se você precisar de um desempenho muito otimizado, talvez não seja o recurso mais indicado para o seu caso.

Pegue o projeto completo aqui :  uLinqDataSource.zip (sem a base de dados)

Aguarde em breve mais artigos sobre ASP .NET E LINQ ...


José Carlos Macoratti