Arquivo da categoria ‘LINQ’

LINQ OpenSession no MVP Summit 2008

Carlos Mattos - LINQ Open Session MVP Global Summit 2008Carlos Mattos - LINQ Open Session MVP Global Summit 2008Carlos Mattos - LINQ Open Session MVP Global Summit 2008Carlos Mattos - LINQ Open Session MVP Global Summit 2008

Estas são algumas fotos da Open Session sobre LINQ realizada durante o MVP Summit 2008, nesta ocasião, tive a oportunidade de participar como host desta sessão. O tema que escolhi para esta Open Session foi o LINQ-to-SQL, que gerou bastante polêmica e muitas discussões. Todos os participantes puderam registrar suas opiniões e compartilhar suas experiências com esta nova tecnologia. A Open Session foi um sucesso, a procura por este tema em especial foi tão grande que tivemos que abrir duas sessões para atender todos os interessaods. Ao final, tivemos um excelente feedback dos participantes. Na sala, tivemos o prazer de contar com as presenças ilustres dos Srs. Jim Wooley (autor de LINQ in Action) e Paul Kimmel (autor de LINQ Unleashed: for C#) cujas participações foram fundamentais para o sucesso da sessão.

Jim Wooley e Carlos Mattos - MVP Global Summit 2008Carlos Mattos e Paul Kimmel - MVP Global Summit 2008

Listando Tabelas e Colunas utilizando LINQ-to-SQL

Recuperar nomes de tabelas e colunas a partir da estrutura do banco de dados é sempre útil no processo de desenvolvimento. Existem diversas técnicas utilizando diferentes tecnologias para isto. Este post mostra como obter uma lista com os nomes das tabelas e seus respectivos campos utilizando o LINQ-to-SQL. O exemplo foi implementado com 1 formulário contendo 1 botão e 1 controle ListBox. Essa construção é possível porque o LINQ-to-SQL mantém o mapeamento da estrutura do banco de dados armazenado no objeto DataContext. Veja abaixo a interface em tempo de execução mostrando a lista das tabelas e colunas:


 

ListandoTabelasColunasLINQ

Agora veja o código necessário para construir esta lista (é bem simples):

 

using
System.Data;
using
System.Drawing;
using
System.Linq;
using
System.Text;
using
System.Windows.Forms;
using
System.Data.Linq;
 

namespace
Testes
{

   public partial class Form1 : Form

   {

  

      DBTeste db = new DBTeste();

 

      public Form1()

      {

         InitializeComponent();

      }

 

      private void Button1_Click(object sender, EventArgs e)

      {

         var DBEstrutura = db.Mapping;

 

         foreach (var Tabela in DBEstrutura.GetTables())

         {

            listBox1.Items.Add(Tabela.TableName);

 

            foreach (var Coluna in Tabela.RowType.DataMembers)

               listBox1.Items.Add(” -” + Coluna.MappedName);

         }

      }

   }

}

Gerenciando Conflitos de Concorrência no LINQ-to-SQL


Introdução

O LINQ-to-SQL oferece uma coleção de APIs (Application Program Interface) para auxiliar o desenvolvedor a identificar, avaliar e solucionar conflitos de concorrência nas suas aplicações.

 

Concorrência Otimista

O modelo otimista para gerenciamento de conflitos de concorrência utiliza o método Resolve(RefreshMode) apresentado pelo Namespace System.Data.Linq. Este método avalia o conflito e atualiza os dados de acordo com o que foi definido pelo desenvolvedor através da Enumeração RefreshMode.

 

Enumeração RefreshMode

Esta enumeração determina como o método Resolve() irá tratar os conflitos de concorrência expostos pela Exception ChangeConflictException. Abaixo estão os membros desta enumeração com uma breve descrição:

 








Membro



Descrição



KeepCurrentValues



Força o método Resolve a substituir os valores originais com os valores contidos no banco de dados. Nenhum valor atual é modificado.



KeepChanges



Força o método Resolve a manter os valores atuais que foram modificados, mas atualiza outros valores com os valores contidos no banco de dados.



OverwriteCurrentValues



Força o método Resolve a sobrescrever os valores atuais com os valores contidos no banco de dados.


 

Entendendo o RefreshMode

Analisando a Enumeração acima, o desenvolvedor pode ter uma interpretação equivocada sobre o comportamento do método Resolve(). Para esclarecer isso abaixo estão três cenários diferentes que ilustram o comportamento do método Resolve para cada Membro da Enumeração RefreshMode.

 

Cenário de Exemplo

Considere o cenário abaixo. Uma Exception do tipo ChangeConflictException é gerada quando o Usuário1 tenta submeter suas alterações ao banco de dados, porque o Usuário2 efetivou modificações nos dados enquanto o Usuário1 estava manipulando o mesmo registro.

 









Ação/Situação



Colunas da Tabela Funcionario



Manager



Assistant



Department



Valores originais quando os usuários 1 e 2 obtiveram os dados



 

Alfreds



 

Maria



 

Sales



O Usuário1 tenta submeter as seguintes alterações



 

Alfred



 

(não modificado)



 

Marketing



O Usuário2 já tinha efetivado as seguintes alterações



 

(não modificado)



 

Mary



 

Service


 

 

Resolvendo conflitos mesclando dados (KeepChanges)

O membro KeepChanges pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro mescla dados do cliente com dados contidos na base.

 







Ação/Situação



Colunas da Tabela Funcionario



Manager



Assistant



Department



 

Estado dos dados após a solução do conflito

 



 

Alfred

(Usuário 1)



 

Mary

(Usuário 2)



 

Marketing

(Usuário 1)


 

 

Resolvendo conflitos mantendo os dados do banco (OverwriteCurrentValues)

O membro OverwriteCurrentValues pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro sobrescreve os valores atuais (no cliente) com os valores encontrados no banco de dados.

 







Ação/Situação



Colunas da Tabela Funcionario



Manager



Assistant



Department



 

Estado dos dados após a solução do conflito

 



 

Alfreds

(Original)



 

Mary

(Usuário 2)



 

Service

(Usuário 2)


 

 

Resolvendo conflitos sobrescrevendo os valores do banco de dados (KeepCurrentValues)

O membro KeepCurrentValues pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro sobrescreve os valores do banco de dados com os valores atuais no cliente.

 







Ação/Situação



Colunas da Tabela Funcionario



Manager



Assistant



Department



 

Estado dos dados após a solução do conflito

 



 

Alfred

(Usuário 1)



 

Maria

(Original)



 

Marketing

(Usuário 1)


 

 

Exemplo de implementação do modelo de concorrência otimista

O procedimento abaixo apresenta o código necessário para implementação do modelo otimista. A linha em destaque mostra a chamada do método Resolve() onde o desenvolvedor pode escolher a ação desejada de acordo com a enumeração RefreshMode.

 

try

{

    db.SubmitChanges(ConflictMode.ContinueOnConflict);

}

 

catch (ChangeConflictException e)

{

    Console.WriteLine(e.Message);

 

    foreach (ObjectChangeConflict occ in db.ChangeConflicts)

    {

        occ.Resolve(RefreshMode.KeepCurrentValues);

    }

}