Partager via


Attachement et détachement d'objets (Entity Framework)

Dans Entity Framework , les objets peuvent être attachés à un contexte d'objet ou en être détachés. Les objets attachés à un contexte d'objet sont suivis et gérés par ce contexte d'objet. Les objets détachés ne sont pas référencés par le contexte de l'objet, et leurs ressources peuvent être récupérées par le .NET Framework. Cette rubrique explique comment attacher et détacher des objets et expose à cet effet quelques éléments à prendre en compte.

Attachement d'objets

Lorsqu'une requête est exécutée dans un contexte d'objet d'Entity Framework , les objets retournés sont automatiquement attachés au contexte de l'objet. Vous pouvez également attacher à un contexte d'objet des objets obtenus à partir d'une source autre qu'une requête. Vous pouvez attacher des objets qui ont été détachés, des objets qui ont été retournés par une requête NoTracking ou encore des objets qui ont été obtenus en dehors du contexte d'objet. Vous pouvez également attacher des objets qui ont été stockés dans l'état d'affichage d'une application ASP.NET ou qui ont été retournés à partir d'un appel de méthode distant ou d'un service Web.

Utilisez l'une des méthodes suivantes pour attacher l'objet à un contexte d'objet :

Membre Description

System.Data.Objects.ObjectSet.AddObject(

ou

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

Ajoute un objet et ses objets connexes à ObjectContext et définit les objets entité sur l'état Added. Dans cet état, les objets entité n'ont pas besoin d'avoir des valeurs de clé uniques. Les valeurs de clé temporaires sont affectées aux propriétés de clé et sont mises à jour avec les valeurs générées par la source de données après avoir enregistré les objets. Après avoir ajouté les objets, modifiez convenablement l'état des objets entité.

System.Data.Objects.ObjectSet.Attach(

ou

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

et

AttachTo

Ajoute un objet à ObjectContext et attribue à l'objet l'état Unchanged. Dans l'état Unchanged, Entity Framework traite les valeurs de clé d'entité comme étant finales. Si plusieurs entités d'un type particulier ont la même valeur de clé, Entity Framework lèvera une exception. Pour éviter d'obtenir l'exception, utilisez la méthode AddObject pour attacher les objets détachés et modifier convenablement l'état.

Les objets sont attachés au contexte de l'objet dans un état Unchanged. Si vous devez modifier l'état d'un objet ou la relation, car vous savez que l'objet a été modifié dans un état détaché, utilisez l'une des méthodes suivantes.

Membre Description

ChangeObjectState

Modifie l'état d'une entité ou d'une relation (tel que Added ou Modified). Cette modification peut avoir un impact sur les relations auxquelles l'entité participe. Par exemple, le passage d'une entité à l'état Added aura également pour effet d'attribuer à toutes les relations non modifiées l'état Added. De la même façon, marquer une entité comme Modified marquera toutes les valeurs scalaires comme Modified.

Vous pouvez également utiliser la méthode ChangeState de ObjectStateEntry.

ChangeRelationshipState

Attribue l'état spécifié à la relation qui existe entre deux entités. S'il n'existe aucune relation entre les entités, cette méthode en crée une avec l'état spécifié. Cette méthode n'est pas prise en charge pour les relations basées sur une association de clé étrangère. Pour plus d'informations, consultez Définition et gestion des relations (Entity Framework).

Vous pouvez également utiliser la méthode ChangeObjectState de l'objet ObjectStateEntry.

ChangeState

Cette méthode se comporte de la même façon que ChangeObjectState ou ChangeRelationshipState selon que ObjectStateEntry est un objet ou une relation.

SetModifiedProperty

Définit des propriétés individuelles sur l'état Modified. Utilisez cette méthode lorsque vous avez connaissance des propriétés qui ont été modifiées au lieu d'attribuer à l'entité entière l'état Modified.

Si certaines valeurs de propriété de l'objet à attacher ont été mises à jour, utilisez l'une des méthodes suivantes :

Membre Description

System.Data.Objects.ObjectSet.ApplyCurrentValues(

ou

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

Copie les valeurs scalaires de l'objet fourni dans l'objet, dans le ObjectContext qui a la même clé. Aucune valeur différente des valeurs d'origine ne sera marquée comme modifiée.

Si vous avez un graphique avec les valeurs actuelles et souhaitez appliquer les valeurs d'origine, appelez la méthode ApplyOriginalValues.

Vous pouvez également utiliser la méthode ApplyCurrentValues de ObjectStateEntry.

System.Data.Objects.ObjectSet.ApplyOriginalValues(

ou

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

Copie les valeurs scalaires de l'objet fourni dans le jeu de valeurs d'origine de l'objet dans le ObjectContext qui a la même clé. Aucune valeur différente des valeurs actuelles ne sera marquée comme modifiée.

Vous pouvez également utiliser la méthode ApplyOriginalValues de ObjectStateEntry.

SetModifiedProperty

Définit des propriétés individuelles sur l'état Modified. Utilisez cette propriété lorsque vous connaissez les propriétés qui ont été modifiées au lieu de définir l'entité entière à modifier.

GetUpdatableOriginalValues

Obtient l'instance OriginalValueRecord qui représente la version pouvant être mise à jour des valeurs d'origine de l'objet associé à ce ObjectStateEntry. Utilisez l'instance OriginalValueRecord retournée pour lire ou mettre à jour individuellement les propriétés d'origine de l'objet.

CurrentValues

Obtient l'instance CurrentValueRecord qui représente la version pouvant être mise à jour des valeurs actuelles de l'objet associé à ce ObjectStateEntry. Utilisez l'instance CurrentValueRecord retournée pour lire ou mettre à jour individuellement les propriétés actuelles de l'objet.

Considérations relatives à l'attachement d'objets

Vous devez tenir compte des points suivants lors de l'attachement d'objets au contexte de l'objet :

  • Si l'objet à attacher a des objets connexes, ces objets sont également attachés au contexte de l'objet.

  • Si l'objet attaché n'existe pas dans la source de données, il n'est pas ajouté lors de l'appel à la méthode SaveChanges. Dans ce cas, lorsque des modifications sont apportées aux propriétés, une exception se produit sur le serveur lors de l'appel à la méthode SaveChanges. Pour ajouter un objet, utilisez System.Data.Objects.ObjectSet.AddObject( ou System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

    Si l'objet à attacher est lié à d'autres objets, vous devez définir explicitement les relations de l'une des façons décrites dans Définition et gestion des relations (Entity Framework). Pour plus d'informations, consultez Procédure : attacher des objets connexes (Entity Framework).

  • L'objet transmis à la méthode Attach doit avoir une valeur EntityKey valide. Si l'objet n'a pas de valeur EntityKey valide, utilisez la méthode AttachTo pour indiquer le nom du jeu d'entités.

  • Une exception InvalidOperationException se produit lorsqu'un objet à attacher possède le même objet EntityKey qu'un autre objet dans le contexte de l'objet. Cette erreur ne se produit pas pour un objet du contexte qui a la même clé mais dont l'état est Added.

Détachement d'objets

Dans les applications Entity Framework , vous pouvez détacher des objets du contexte de l'objet. Vous pouvez détacher des objets afin de conserver des ressources, car l'exécution de requêtes répétées dans un même contexte d'objet accroît les besoins en mémoire du contexte de l'objet. Vous pouvez empêcher l'attachement d'objets au contexte de l'objet en exécutant une requête après avoir attribué à l'objet MergeOption la valeur NoTracking, comme vous pouvez les détacher en appelant la méthode System.Data.Objects.ObjectSet.Detach( ou System.Data.Objects.ObjectContext.Detach(System.Object) et en passant une référence à l'objet détaché, comme dans l'exemple suivant :

' Detach the first SalesOrderDetail in the collection. 
context.Detach(order.SalesOrderDetails.First())
// Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First());

Considérations relatives au détachement d'objets

Vous devez tenir compte des points suivants lors du détachement d'objets :

  • Detach affecte uniquement l'objet spécifique passé à la méthode. Si l'objet à détacher possède des objets connexes dans le contexte de l'objet, ces objets ne sont pas détachés.

  • Dans une association indépendante, les informations de relation ne sont pas conservées pour un objet détaché.

  • Les informations relatives à l'état de l'objet ne sont pas conservées lorsqu'un objet est détaché. Cela inclut les modifications suivies et les valeurs de clé temporaires.

  • Le détachement d'objets n'affecte pas les données contenues dans la source de données.

  • Les directives de suppression en cascade et les contraintes référentielles d'une relation d'identification ne sont pas appliquées lors d'une opération de détachement.

  • Les avantages du détachement d'objets doivent être considérés en tenant compte du traitement supplémentaire requis pour effectuer l'opération. Lorsque l'étendue des données utilisateur a changé, tel que l'affichage d'un nouveau formulaire avec un ensemble de données différent, vous devez envisager de créer une nouvelle instance ObjectContext, plutôt que de détacher simplement les objets d'un objet ObjectContext existant.

Pour plus d'informations, consultez Procédure : détacher des objets d'un contexte d'objet (Entity Framework).

Dans cette section

Procédure : attacher des objets connexes (Entity Framework)

Procédure : appliquer des modifications apportées à un objet détaché (Entity Framework)

Procédure : détacher des objets d'un contexte d'objet (Entity Framework)

Voir aussi

Concepts

Génération d'applications multicouches (Entity Framework)