如何:应用对已分离对象的更改(实体框架)
本主题提供的示例介绍如何应用对同一对象的已分离实例所做的对象更新。 当对象经过远程更新并重新设置到服务器以保留更改时将使用此过程。 如果对象只是简单地附加到服务器上的对象上下文中,更新将丢失;或者如果对象已在对象上下文中,操作将失败。 发生这种情况是因为对象是在 Unchanged 状态下附加的。 有关更多信息,请参见附加和分离对象(实体框架)。
本主题中的示例基于 Adventure Works 销售模型。 若要运行本示例中的代码,必须已将 AdventureWorks 销售模型添加到您的项目中,并将项目配置为使用实体框架。 为此,请完成如何:手动配置实体框架项目和如何:手动定义模型和映射文件(实体框架) 中的过程。
示例
在下面的示例中,将更新的 SalesOrderDetail 对象与原始对象一起传递给 UpdateItemChanges 方法。 这样无需查询对象也不必在内存中保存对象即可应用更改。 也可以从数据库中检索原始对象,而无需客户端传递这些内容。
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();
}
}