附加对象(实体框架)
在实体框架的某个对象上下文内执行查询时,返回的对象会自动附加到该对象上下文。还可以将从源而不是从查询获得的对象附加到对象上下文。您可以附加以前分离的对象、由 NoTracking 查询返回的对象或从对象上下文的外部获取的对象。还可以附加存储在 ASP.NET 应用程序的视图状态中的对象或从远程方法调用或 Web 服务返回的对象。
使用下列方法之一将对象附加到对象上下文:
调用 ObjectContext 上的 AddObject 将对象附加到对象上下文。当对象为数据源中尚不存在的新对象时采用此方法。
调用 ObjectContext 上的 Attach 将对象附加到对象上下文。当对象已存在于数据源中但当前尚未附加到上下文时采用此方法。有关更多信息,请参见如何:附加相关对象(实体框架)。
调用 ObjectContext 的 AttachTo,以将对象附加到对象上下文中的特定实体集。如果对象具有 null(在 Visual Basic 中为 Nothing)EntityKey 值,也可以执行此操作。
调用 ObjectContext 上的 ApplyPropertyChanges。当对象已存在于数据源中,并且分离的对象具有您希望保存的属性更新时采用此方法。如果简单地附加该对象,则属性更改将丢失。有关更多信息,请参见如何:应用对已分离对象的更改(实体框架)。
将对象附加到对象上下文时应注意以下注意事项:
如果被附加的对象具有相关对象,则这些对象也被附加到对象上下文。
若要使用 Attach 附加一个对象,该对象必须实现 IEntityWithKey 并具有有效的键。
对象以 Unchanged 状态附加到对象上下文。
如果附加的对象不在数据源中,则在执行 SaveChanges 时不会添加该对象。在这种情况下,如果对属性进行了更改,则在执行 SaveChanges 时在服务器上会引发异常。若要添加对象,请使用 AddObject 而不是 Attach。
如果被附加的对象与其他对象相关,则必须使用下列方式之一对关系进行显式定义:
将两个对象都附加到对象上下文,然后调用 EntityCollection 或 EntityReference 上的 Attach 对关系进行定义。
如果两个对象都未被附加,则调用 EntityCollection 上的 Add 并指定相关对象,或者将 EntityReference 的 Value 属性设置为相关对象。下一步,将对象图的根附加到对象上下文。可以使用此方法从分离的对象来构造对象图,然后将图附加到对象上下文。
当附加使用 XML 序列化进行了序列化的相关对象时使用这些方法。有关更多信息,请参见如何:附加相关对象(实体框架)。
如果被附加的对象具有更新的属性值,请使用 ApplyPropertyChanges 将更新应用到现有对象。有关更多信息,请参见如何:应用对已分离对象的更改(实体框架)。
传递到 Attach 方法的对象必须具有有效的 EntityKey 值。如果对象没有有效的 EntityKey 值,请使用 AttachTo 方法指定实体集的名称。
当被附加的对象与对象上下文中已存在的另一个对象具有相同的 EntityKey 时,将发生 InvalidOperationException。如果该对象实例已在对象上下文中,不会发生此错误;只要对象状态为 Unchanged,就可以对同一个对象实例多次调用 Attach。
使用 AttachTo 方法可将对象附加到特定的实体集。有关更多信息,请参见添加、修改和删除对象(实体框架)。
当使用 AttachTo 方法附加的对象已经定义了其实体键时,如果 entitySetName 参数的值与现有键中的实体集名称不匹配,则会发生 InvalidOperationException。
另请参见
概念
分离对象(实体框架)
Web 服务和实体数据模型(应用程序方案)