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

Cette rubrique présente la manière d'appliquer à un objet les mises à jour apportées à une instance détachée de ce même objet. Cette procédure est utilisée lorsqu'un objet est mis à jour à distance, puis renvoyé sur le serveur pour rendre les modifications persistantes. Si l'objet est simplement attaché à un contexte d'objet sur le serveur, les mises à jour sont perdues ou l'opération échoue si l'objet se trouve déjà dans le contexte de l'objet. En effet, les objets sont attachés avec l'état Unchanged. Pour plus d'informations, voir Attachement et détachement d'objets (Entity Framework).

L'exemple de cette rubrique est basé sur le modèle de vente Adventure Works Sales Model. Pour exécuter le code de cet exemple, vous devez déjà avoir ajouté le modèle de vente AdventureWorks Sales Model à votre projet et configuré ce dernier pour qu'il utilise Entity Framework. Pour ce faire, exécutez les procédures décrites dans Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement les fichiers du modèle et les fichiers de mappage (Entity Framework).

Exemple

Dans l'exemple suivant, un objet SalesOrderDetail mis à jour est passé à la méthode UpdateItemChanges avec l'objet d'origine. Les modifications peuvent ainsi être appliquées sans interroger l'objet ou avoir à le rendre persistant dans la mémoire. Vous pouvez également extraire l'objet d'origine de la base de données au lieu d'exiger que le client le transmette.

Private Shared Sub ApplyItemUpdates(ByVal originalItem As SalesOrderDetail, ByVal updatedItem As SalesOrderDetail)
    Using context As New AdventureWorksEntities()
        context.SalesOrderDetails.Attach(updatedItem)
        ' Check if the ID is 0, if it is the item is new. 
        ' In this case we need to chage the state to Added. 
        If updatedItem.SalesOrderDetailID = 0 Then
            ' Because the ID is generated by the database we do not need to 
            ' set updatedItem.SalesOrderDetailID. 
            context.ObjectStateManager.ChangeObjectState(updatedItem, System.Data.EntityState.Added)
        Else
            ' If the SalesOrderDetailID is not 0, then the item is not new 
            ' and needs to be updated. Because we already added the 
            ' updated object to the context we need to apply the original values. 
            ' If we attached originalItem to the context 
            ' we would need to apply the current values: 
            ' context.ApplyCurrentValues("SalesOrderDetails", updatedItem); 
            ' Applying current or original values, changes the state 
            ' of the attached object to Modified. 
            context.ApplyOriginalValues("SalesOrderDetails", originalItem)
        End If
        context.SaveChanges()
    End Using
End Sub
private static void ApplyItemUpdates(SalesOrderDetail originalItem,
    SalesOrderDetail updatedItem)
{
    using (AdventureWorksEntities context =
        new AdventureWorksEntities())
    {
        context.SalesOrderDetails.Attach(updatedItem);
        // Check if the ID is 0, if it is the item is new. 
        // In this case we need to chage the state to Added.
        if (updatedItem.SalesOrderDetailID == 0)
        {
            // Because the ID is generated by the database we do not need to
            // set updatedItem.SalesOrderDetailID.
            context.ObjectStateManager.ChangeObjectState(updatedItem, System.Data.EntityState.Added);
        }
        else
        {
            // If the SalesOrderDetailID is not 0, then the item is not new
            // and needs to be updated. Because we already added the 
            // updated object to the context we need to apply the original values.
            // If we attached originalItem to the context 
            // we would need to apply the current values:
            // context.ApplyCurrentValues("SalesOrderDetails", updatedItem);
            // Applying current or original values, changes the state 
            // of the attached object to Modified.
            context.ApplyOriginalValues("SalesOrderDetails", originalItem);
        }
        context.SaveChanges();
    }
}

Voir aussi

Concepts

Génération d'applications multicouches (Entity Framework)
Sérialisation d'objets (Entity Framework)
Attachement et détachement d'objets (Entity Framework)
Utilisation d'objets (Entity Framework)