LINQ to SQL – Usando chave composta


Estou de volta das minhas tão esperadas férias. Depois de dois anos é muito bom poder descansar um pouco.

Durante as férias tive tempo para responder alguns emails que havia recebido com dúvidas após o TechEd. Uma das dúvidas bem interessantes que recebi foi sobre o uso de chave composta com o LINQ to SQL. A pessoa queria saber se era possível utilizar tabelas com chave compostas para o mapeamento no LINQ to SQL e depois criar o relacionamento ente objetos.

A resposta é:  sim. É possível utilizar tabelas com chave composta no LINQ to SQL. Fiz um pequeno exemplo utilizando a Northwind database.

A tabela EmployeeTerritories tem uma chave composta. O mapeamento desta tabela poderia ser feito de acordo com o código abaixo.

   1: [Table(Name = "EmployeeTerritories")]
   2: public class EmployeeTerritorie
   3: {
   4:  [Column(IsPrimaryKey = true)]
   5:  public int EmployeeID;
   6:  [Column(IsPrimaryKey = true)]
   7:  public string TerritoryID;
   8: }

Note nas linhas 4 e 6 que os dois atributos são identificados como chave primária.

Depois criei uma tabela de teste para associar uma descrição aos territórios dos funcionários. Esta tabela tem relacionamento com a tabela EmployeeTerritories. O mapeamento poderia ser feito assim:

   1: [Table(Name = "Teste")]
   2: public class Teste
   3: {
   4:     [Column(IsPrimaryKey = true)]
   5:     public int EmployeeID;
   6:     [Column(IsPrimaryKey = true)]
   7:     public string TerritoryID;
   8:     [Column]
   9:     public string Description;
  10:  
  11:     [Association()]
  12:     public EntitySet<EmployeeTerritorie> EmployeeTerritorie;
  13: }

Note que também identificamos os dois atributos como chave primária, formando uma chave composta. Note também que nas linhas 11 e 12 eu crio um associação com a entidade EmployeeTerritories da mesma maneira como criamos qualquer outra associação em LINQ to SQL.

Para testar este exemplo você pode utilizar o código abaixo. Este código utiliza uma classe ObjectDumper que pode ser obtida com o SDK do LINQ. Esta linha poderia ser substituída por um console.write ou por qualquer outro tipo de manipulação dos objetos.

   1: NorthwindDb.Northwind _db = new NorthwindDb.Northwind(_connString);
   2:  
   3: var x = from e in _db.Testes
   4:         select e;
   5:  
   6: foreach (var emp in x)
   7: {
   8:     ObjectDumper.Write(emp,1);
   9: }

P.S: Se você olhar com calma notará que pode não fazer muito sentido criar uma associação com EmployeeTerritories, já que este objeto possui apenas as duas chaves e nenhuma informação adicional. Isto é verdade. Porém, esta foi a primeira tabela com chave composta que achei na base Northwind quando estava preparando o exemplo para responder o email. smile_regular O meu objetivo aqui é apenas mostrar que é possível trabalhar com chaves compostas no LINQ to SQL.

 

Até mais!!

Comments (2)

  1. Estou de volta das minhas t&#227;o esperadas f&#233;rias. Depois de dois anos &#233; muito bom poder

  2. srecosta says:

    Opa! Bem-vindo de volta.

    Abraço,

    Eduardo Costa.

Skip to main content