Partage via


Identité d'un objet

Les identités des objets du runtime sont uniques. Deux variables qui font référence au même objet font en réalité référence à la même instance de l'objet. Par conséquent, les modifications que vous apportez avec un chemin d'accès via une variable sont immédiatement visibles via l'autre variable.

Les lignes d'une table de bases de données relationnelle n'ont pas d'identités uniques. Étant donné que chaque ligne a une clé primaire unique, deux lignes ne peuvent pas partager la même valeur de clé. Toutefois, cela concerne uniquement le contenu de la table de base de données.

Dans la réalité, les données sont souvent extraites de la base de données vers une couche différente où une application fonctionne avec celles-ci. C’est le modèle pris en charge par LINQ to SQL. Lorsque des données sont extraites de la base de données comme lignes, il est peu probable que deux lignes qui représentent les mêmes données correspondent réellement aux mêmes instances de ligne. Si vous interrogez un client spécifique deux fois, vous obtenez deux lignes de données. Chaque ligne contient les mêmes informations.

Vous souhaitez obtenir quelque chose de très différent avec les objets. Si vous demandez à plusieurs reprises les mêmes informations au DataContext, vous vous attendez à ce que celui-ci vous donne la même instance d'objet. Ce comportement est attendu, étant donné que les objets ont une signification particulière pour votre application, et vous vous attendez à ce qu'ils se comportent comme des objets. Vous les avez conçus comme des hiérarchies ou des graphiques. Vous comptez les récupérer comme tels et ne pas recevoir de nombreuses instances répliquées uniquement parce que vous avez effectué la même demande plusieurs fois.

Dans LINQ to SQL, DataContext gère l’identité des objets. À chaque fois que vous récupérez une nouvelle ligne de la base de données, elle est entrée dans une table d'identités par sa clé primaire et un objet est créé. À chaque fois que vous récupérez cette ligne, l'instance d'objet d'origine est remise à l'application. De cette façon, le DataContext traduit le concept d'identité tel que la base de données l'a vu (autrement dit, des clés primaire) en concept d'identité vu par le langage (autrement dit, des instances). L'application voit uniquement l'objet dans l'état dans lequel il a été récupéré la première fois. Si les nouvelles données sont différentes, elles sont ignorées. Pour plus d’informations, consultez Récupération d’objets auprès du cache des identités.

LINQ to SQL utilise cette approche pour gérer l’intégrité d’objets locaux afin de prendre en charge les mises à jour optimistes. Étant donné que les seules modifications qui se produisent une fois que l'objet a été créé sont celles effectuées par l'application, le rôle de l'application est correctement défini. Si un tiers extérieur a effectué des modifications dans l'intervalle, elles sont identifiées au moment où SubmitChanges() est appelé.

Notes

Si l'objet demandé par la requête est facilement identifiable comme un objet déjà récupéré, aucune requête n'est exécutée. La table d'identités agit en tant que cache de tous les objets récupérés précédemment.

Exemples

Exemple 1 de la mise en cache d'objets

Dans cet exemple, si vous exécutez les mêmes requêtes deux fois, vous recevez une référence au même objet en mémoire à chaque fois.

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()

Exemple 2 de la mise en cache d'objets

Dans cet exemple, si vous exécutez des requêtes différentes qui retournent la même ligne de la base de données, vous recevez une référence au même objet en mémoire à chaque fois.

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

Voir aussi