Cómo aplicar los cambios realizados a un objeto desasociado (Entity Framework)
En este tema, se proporciona un ejemplo de cómo aplicar a un objeto las actualizaciones llevadas a cabo en una instancia desasociada del mismo objeto. Este procedimiento se usa cuando un objeto se actualiza desde una ubicación remota y se restablece en el servidor para conservar los cambios. Si el objeto simplemente estuviera asociado a un contexto del objeto en el servidor, las actualizaciones se perderían, o bien se produciría un error en la operación si el objeto ya estuviera en el contexto del objeto. Esto sucede porque los objetos se asocian en un estado Unchanged. Para obtener más información, vea Asociar objetos (Entity Framework).
El ejemplo de este tema se basa en el modelo Adventure Works Sales. Para ejecutar el código de este ejemplo, debe haber agregado ya el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para que use Entity Framework. Para ello, complete los procedimientos de Cómo configurar manualmente un proyecto de Entity Framework y Cómo definir manualmente un modelo Entity Data Model (Entity Framework).
Ejemplo
En el ejemplo siguiente, se pasa un objeto SalesOrderDetail actualizado al método UpdateItemChanges, junto con el objeto original. Esto permite aplicar los cambios sin consultar el objeto y sin tener que conservarlo en la memoria.
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());
}
}
}
En este ejemplo, se recupera el objeto SalesOrderDetail original y, a continuación, se aplican los cambios a dicho objeto basándose en un objeto SalesOrderDetail actualizado pasado al método 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());
}
}
}
Vea también
Conceptos
Servicios web y Entity Data Model (escenarios de aplicación)
Serializar objetos (Entity Framework)
Asociar objetos (Entity Framework)