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 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 un modèle EDM (Entity Data Model) (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 avoir à interroger l'objet ou à le rendre persistant dans la mémoire.
Private Shared Sub ApplyItemUpdates(ByVal originalItem As SalesOrderDetail, _
ByVal updatedItem As SalesOrderDetail)
Using advWorksContext As AdventureWorksEntities = _
New AdventureWorksEntities()
Try
' Attach the original item to the object context.
advWorksContext.Attach(originalItem)
' Call the ApplyPropertyChanges method to apply changes
' from the updated item to the original version.
advWorksContext.ApplyPropertyChanges( _
"SalesOrderDetail", updatedItem)
advWorksContext.SaveChanges()
Catch ex As InvalidOperationException
Console.WriteLine(ex.ToString())
End Try
End Using
End Sub
private static void ApplyItemUpdates(SalesOrderDetail originalItem,
SalesOrderDetail updatedItem)
{
using (AdventureWorksEntities advWorksContext =
new AdventureWorksEntities())
{
try
{
// Attach the original item to the object context.
advWorksContext.Attach(originalItem);
// Call the ApplyPropertyChanges method to apply changes
// from the updated item to the original version.
advWorksContext.ApplyPropertyChanges("SalesOrderDetail",
updatedItem);
advWorksContext.SaveChanges();
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
}
}
Dans cet exemple, l'objet SalesOrderDetail d'origine est récupéré, puis il est modifié en fonction d'un objet SalesOrderDetail mis à jour passé à la méthode UpdateItemChanges.
Private Shared Sub ApplyItemUpdates(ByVal updatedItem As SalesOrderDetail)
' Define an ObjectStateEntry and EntityKey for the current object.
Dim key As EntityKey
Dim originalItem As Object
Using advWorksContext As AdventureWorksEntities = _
New AdventureWorksEntities()
Try
' Create the detached object's entity key.
key = advWorksContext.CreateEntityKey("SalesOrderDetail", updatedItem)
' Get the original item based on the entity key from the context
' or from the database.
If advWorksContext.TryGetObjectByKey(key, originalItem) Then
' Call the ApplyPropertyChanges method to apply changes
' from the updated item to the original version.
advWorksContext.ApplyPropertyChanges( _
key.EntitySetName, _
updatedItem)
End If
advWorksContext.SaveChanges()
Catch ex As InvalidOperationException
Console.WriteLine(ex.ToString())
End Try
End Using
End Sub
private static void ApplyItemUpdates(SalesOrderDetail updatedItem)
{
// Define an ObjectStateEntry and EntityKey for the current object.
EntityKey key;
object originalItem;
using (AdventureWorksEntities advWorksContext =
new AdventureWorksEntities())
{
try
{
// Create the detached object's entity key.
key = advWorksContext.CreateEntityKey("SalesOrderDetail", updatedItem);
// Get the original item based on the entity key from the context
// or from the database.
if (advWorksContext.TryGetObjectByKey(key, out originalItem))
{
// Call the ApplyPropertyChanges method to apply changes
// from the updated item to the original version.
advWorksContext.ApplyPropertyChanges(
key.EntitySetName, updatedItem);
}
advWorksContext.SaveChanges();
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
}
}
Voir aussi
Concepts
Services Web et Entity Data Model (scénarios d'application)
Sérialisation d'objets (Entity Framework)
Attachement d'objets (Entity Framework)