Partilhar via


Identidade do objeto

Os objetos no tempo de execução têm identidades exclusivas. Duas variáveis que se referem ao mesmo objeto, na verdade, referem-se à mesma instância do objeto. Devido a esse fato, as alterações que você faz por meio de um caminho através de uma variável são imediatamente visíveis através da outra.

As linhas em uma tabela de banco de dados relacional não têm identidades exclusivas. Como cada linha tem uma chave primária exclusiva, não há duas linhas que compartilhem o mesmo valor de chave. No entanto, esse fato restringe apenas o conteúdo da tabela do banco de dados.

Na realidade, os dados geralmente são trazidos do banco de dados para uma camada diferente, onde um aplicativo trabalha com eles. Este é o modelo que o LINQ to SQL suporta. Quando os dados são retirados do banco de dados como linhas, você não tem expectativa de que duas linhas que representam os mesmos dados correspondam realmente às mesmas instâncias de linha. Se você consultar um cliente específico duas vezes, obterá duas linhas de dados. Cada linha contém as mesmas informações.

Com objetos você espera algo muito diferente. Você espera que, se você pedir as DataContext mesmas informações repetidamente, isso de fato lhe dará a mesma instância de objeto. Você espera esse comportamento porque os objetos têm um significado especial para seu aplicativo e você espera que eles se comportem como objetos. Você os projetou como hierarquias ou gráficos. Você espera recuperá-los como tal e não receber multidões de instâncias replicadas apenas porque pediu a mesma coisa mais de uma vez.

No LINQ to SQL, o gerencia a identidade do DataContext objeto. Sempre que você recupera uma nova linha do banco de dados, a linha é registrada em uma tabela de identidade por sua chave primária e um novo objeto é criado. Sempre que você recuperar essa mesma linha, a instância do objeto original será devolvida ao aplicativo. Desta forma, traduz DataContext o conceito de identidade visto pela base de dados (isto é, chaves primárias) para o conceito de identidade visto pela linguagem (isto é, instâncias). O aplicativo só vê o objeto no estado em que foi recuperado pela primeira vez. Os novos dados, se diferentes, são descartados. Para obter mais informações, consulte Recuperando objetos do cache de identidade.

O LINQ to SQL usa essa abordagem para gerenciar a integridade de objetos locais para oferecer suporte a atualizações otimistas. Como as únicas alterações que ocorrem depois que o objeto é criado inicialmente são aquelas feitas pelo aplicativo, a intenção do aplicativo é clara. Se entretanto tiverem ocorrido alterações por parte externa, estas são identificadas no momento SubmitChanges() em que é chamada.

Nota

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

Exemplos

Exemplo de cache de objetos 1

Neste exemplo, se você executar a mesma consulta duas vezes, 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()

Exemplo de cache de objetos 2

Neste exemplo, se você executar consultas diferentes que retornam a mesma linha do banco de dados, receberá sempre uma referência ao mesmo objeto na memória.

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

Consulte também