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. O meu objetivo aqui é apenas mostrar que é possível trabalhar com chaves compostas no LINQ to SQL.
Até mais!!
Comments
Anonymous
January 16, 2008
Estou de volta das minhas tão esperadas férias. Depois de dois anos é muito bom poderAnonymous
January 17, 2008
Opa! Bem-vindo de volta. Abraço, Eduardo Costa.