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!!