Compartilhar via


Identidade do objeto

Os objetos em runtime têm identidades exclusivas. Duas variáveis que referem-se ao mesmo objeto realmente referem-se à mesma instância de objeto. Devido ao fato, as alterações feitas por um caminho com uma variável imediatamente são visíveis com o outro.

As linhas em uma tabela de base de dados relacional não têm identidades exclusivas. Porque cada linha tem uma chave primária exclusivo, não há duas linhas compartilham o mesmo valor principal. No entanto, esse fato restringe somente o conteúdo da tabela de base de dados.

Na realidade, os dados são trazidos freqüêntemente fora de base de dados e uma camada diferente, onde o aplicativo funciona com ele. Esse é o modelo compatível com LINQ to SQL. Quando dados são trazidos fora de base de dados como linhas, você não tem nenhuma expectativa que duas linhas que representam os mesmos dados realmente correspondem às mesmas instâncias de linha. Se você consultar um cliente específico duas vezes, terá duas linhas de dados. Cada linha contém as mesmas informações.

Com objetos você espera algo muito diferentes. Você espera que se você solicitar DataContext a mesma informações repetidamente, dará de fato a mesma instância de objeto. Você espera esse comportamento como os objetos têm significado especial para seu aplicativo e os você espera se comportem como objetos. Você os criou como hierarquias ou grafos. Você espera recuperá-los como esta'n e não receber multidões de instâncias replicadas exatamente como você solicitou a mesma coisa mais de uma vez.

Em LINQ to SQL, o DataContext gerencia a identidade do objeto. Sempre que você recupera uma nova linha de base de dados, a linha é entrada uma tabela de identidade por sua chave primária, e um novo objeto é criado. Sempre que você mesmo que recupera linhas, a instância original de objeto é entregada de volta para o aplicativo. Assim DataContext converte o conceito de identidade como mostrado por base de dados (isto é, chaves primárias) no conceito de identidade consultado pela linguagem (isto é, instâncias). O aplicativo considera apenas o objeto no estado que foi recuperado primeiro. Novos dados, se diferentes, são descartados. Para obter mais informações, consulte Recuperar objetos do cache de identidade.

O LINQ to SQL usa essa abordagem para gerenciar a integridade de objetos locais para suporte a atualizações otimistas. Porque as únicas alterações que ocorrem após o objeto é criado no início essas são feitas pelo aplicativo, a intenção de aplicativo são claras. Se as alterações por uma parte externo ocorreram em ínterim, são identificadas em SubmitChanges() é chamado.

Observação

Se o objeto solicitado pela consulta é facilmente identificável porque se já recuperado, nenhuma consulta é executada. A tabela de identidade atua como um cache de todos os objetos anteriormente recuperados.

Exemplos

Exemplo 1 de cache de objeto

Nesse exemplo, se você executa a mesma consulta duas vezes, você receberá uma referência ao mesmo objeto na memória todas as vezes.

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Objeto que armazena em cachê o exemplo 2

Nesse exemplo, se você executa as diferentes consultas que retornam a mesma linha de base de dados, você receberá uma referência ao mesmo objeto na memória todas as vezes.

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from ord in db.Orders
     where ord.Customer.CustomerID == "BONAP"
     select ord).First().Customer;
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From ord In db.Orders _
     Where ord.Customer.CustomerID = "BONAP" _
     Select ord).First().Customer

Confira também