Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli oggetti nel runtime hanno identità univoche. Due variabili che fanno riferimento allo stesso oggetto fanno effettivamente riferimento alla stessa istanza dell'oggetto. A causa di questo fatto, le modifiche apportate tramite un percorso attraverso una variabile sono immediatamente visibili attraverso l'altro.
Le righe di una tabella di database relazionale non hanno identità univoche. Poiché ogni riga ha una chiave primaria univoca, non due righe condividono lo stesso valore di chiave. Tuttavia, questo fatto vincola solo il contenuto della tabella di database.
In realtà, i dati vengono spesso portati fuori dal database e in un livello diverso, in cui un'applicazione funziona con esso. Si tratta del modello supportato da LINQ to SQL. Quando i dati vengono portati fuori dal database come righe, non si prevede che due righe che rappresentano gli stessi dati corrispondano effettivamente alle stesse istanze di riga. Se si esegue una query per un cliente specifico due volte, si ottengono due righe di dati. Ogni riga contiene le stesse informazioni.
Con gli oggetti ci si aspetta qualcosa di molto diverso. Si presume che, se si richiede DataContext ripetutamente per ottenere le stesse informazioni, verrà effettivamente restituita la stessa istanza dell'oggetto. Si prevede questo comportamento perché gli oggetti hanno un significato speciale per l'applicazione e si prevede che si comportino come oggetti. Sono state progettate come gerarchie o grafici. Si prevede di recuperarli come tali e non ricevere molte istanze replicate solo perché è stata richiesta la stessa cosa più di una volta.
In LINQ to SQL, DataContext gestisce l'identità degli oggetti. Ogni volta che si recupera una nuova riga dal database, la riga viene registrata in una tabella Identity tramite la relativa chiave primaria e viene creato un nuovo oggetto. Ogni volta che si recupera la stessa riga, l'istanza dell'oggetto originale viene restituita all'applicazione. In questo modo il DataContext concetto di identità viene convertito come visto dal database (ovvero le chiavi primarie) nel concetto di identità visto dal linguaggio (ovvero le istanze). L'applicazione vede solo l'oggetto nello stato in cui è stato recuperato per la prima volta. I nuovi dati, se diversi, vengono eliminati. Per altre informazioni, vedere Recupero di oggetti dalla cache delle identità.
LINQ to SQL usa questo approccio per gestire l'integrità degli oggetti locali per supportare gli aggiornamenti ottimistici. Poiché le uniche modifiche che si verificano dopo la creazione dell'oggetto sono quelle apportate dall'applicazione, la finalità dell'applicazione è chiara. Se le modifiche apportate da una parte esterna sono state apportate nel frattempo, vengono identificate al momento SubmitChanges() della chiamata.
Annotazioni
Se l'oggetto richiesto dalla query è facilmente identificabile come uno già recuperato, non viene eseguita alcuna query. La tabella Identity funge da cache di tutti gli oggetti recuperati in precedenza.
Esempi
Esempio di memorizzazione nella cache degli oggetti 1
In questo esempio, se si esegue la stessa query due volte, si riceve un riferimento allo stesso oggetto in memoria ogni volta.
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()
Esempio di memorizzazione nella cache degli oggetti 2
In questo esempio, se si eseguono query diverse che restituiscono la stessa riga dal database, si riceverà un riferimento allo stesso oggetto in memoria ogni volta.
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