附加对象(实体框架)

在实体框架的某个对象上下文内执行查询时,返回的对象会自动附加到该对象上下文。还可以将从源而不是从查询获得的对象附加到对象上下文。您可以附加以前分离的对象、由 NoTracking 查询返回的对象或从对象上下文的外部获取的对象。还可以附加存储在 ASP.NET 应用程序的视图状态中的对象或从远程方法调用或 Web 服务返回的对象。

使用下列方法之一将对象附加到对象上下文:

  • 调用 ObjectContext 上的 AddObject 将对象附加到对象上下文。当对象为数据源中尚不存在的新对象时采用此方法。

  • 调用 ObjectContext 上的 Attach 将对象附加到对象上下文。当对象已存在于数据源中但当前尚未附加到上下文时采用此方法。有关更多信息,请参见如何:附加相关对象(实体框架)

  • 调用 ObjectContextAttachTo,以将对象附加到对象上下文中的特定实体集。如果对象具有 null(在 Visual Basic 中为 NothingEntityKey 值,也可以执行此操作。

  • 调用 ObjectContext 上的 ApplyPropertyChanges。当对象已存在于数据源中,并且分离的对象具有您希望保存的属性更新时采用此方法。如果简单地附加该对象,则属性更改将丢失。有关更多信息,请参见如何:应用对已分离对象的更改(实体框架)

将对象附加到对象上下文时应注意以下注意事项:

  • 如果被附加的对象具有相关对象,则这些对象也被附加到对象上下文。

  • 若要使用 Attach 附加一个对象,该对象必须实现 IEntityWithKey 并具有有效的键。

  • 对象以 Unchanged 状态附加到对象上下文。

  • 如果附加的对象不在数据源中,则在执行 SaveChanges 时不会添加该对象。在这种情况下,如果对属性进行了更改,则在执行 SaveChanges 时在服务器上会引发异常。若要添加对象,请使用 AddObject 而不是 Attach

  • 如果被附加的对象与其他对象相关,则必须使用下列方式之一对关系进行显式定义:

    • 将两个对象都附加到对象上下文,然后调用 EntityCollectionEntityReference 上的 Attach 对关系进行定义。

    • 如果两个对象都未被附加,则调用 EntityCollection 上的 Add 并指定相关对象,或者将 EntityReferenceValue 属性设置为相关对象。下一步,将对象图的根附加到对象上下文。可以使用此方法从分离的对象来构造对象图,然后将图附加到对象上下文。

    当附加使用 XML 序列化进行了序列化的相关对象时使用这些方法。有关更多信息,请参见如何:附加相关对象(实体框架)

  • 如果被附加的对象具有更新的属性值,请使用 ApplyPropertyChanges 将更新应用到现有对象。有关更多信息,请参见如何:应用对已分离对象的更改(实体框架)

  • 传递到 Attach 方法的对象必须具有有效的 EntityKey 值。如果对象没有有效的 EntityKey 值,请使用 AttachTo 方法指定实体集的名称。

  • 当被附加的对象与对象上下文中已存在的另一个对象具有相同的 EntityKey 时,将发生 InvalidOperationException。如果该对象实例已在对象上下文中,不会发生此错误;只要对象状态为 Unchanged,就可以对同一个对象实例多次调用 Attach

  • 使用 AttachTo 方法可将对象附加到特定的实体集。有关更多信息,请参见添加、修改和删除对象(实体框架)

  • 当使用 AttachTo 方法附加的对象已经定义了其实体键时,如果 entitySetName 参数的值与现有键中的实体集名称不匹配,则会发生 InvalidOperationException

另请参见

概念

分离对象(实体框架)
Web 服务和实体数据模型(应用程序方案)

其他资源

管理对象上下文(实体框架)