Как применить изменения к отсоединенному объекту (платформа Entity Framework)
В этом разделе приведен пример того, как применить к объекту обновления, выполненные в отсоединенном экземпляре того же объекта. Эта процедура используется, если объект обновляется отдельно, а затем возвращается на сервер для сохранения изменений. Если объект будет просто присоединен к контексту объекта на сервере, то обновления окажутся потерянными или операция окончится неудачей при условии, что объект уже находился в контексте объекта. Это происходит, поскольку объекты присоединяются в состоянии Unchanged. Дополнительные сведения см. в разделе Присоединение объектов (платформа Entity Framework).
Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код, используемый в данном примере, нужно сначала добавить к проекту модель AdventureWorks Sales и настроить его для использования платформы Entity Framework. Для этого выполните инструкции из разделов Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (платформа Entity Framework).
Примеры
В следующем примере обновленный объект SalesOrderDetail передается методу UpdateItemChanges наряду с первоначальным объектом. Это дает возможность применить изменения без запроса объекта и без необходимости его сохранения в памяти.
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());
}
}
}
В этом примере происходит получение первоначального объекта SalesOrderDetail, а затем изменения применяются к нему исходя из обновленного объекта SalesOrderDetail, переданного методу 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());
}
}
}
См. также
Основные понятия
Веб-службы и модель EDM (сценарии приложений)
Сериализация объектов (платформа Entity Framework)
Присоединение объектов (платформа Entity Framework)