附加及中斷連結物件

在 Entity Framework 中,可以將物件附加至物件內容,或將物件從物件內容中斷連結。附加至物件內容的物件會由該物件內容進行追蹤及管理。物件內容不會參考中斷連結的物件,而且 .NET Framework 可以回收這些物件的資源。此主題描述如何附加和中斷連結物件,以及執行這些動作的一些考量因素。

附加物件

在 Entity Framework 中的物件內容內執行查詢時,傳回的物件會自動附加到物件內容。您也可以將物件附加到從查詢以外的來源取得的物件內容。您可以附加之前已中斷連結的物件、NoTracking 查詢之前傳回的物件,或是從物件內容外部取得的物件。您也可以附加在 ASP.NET 應用程式的檢視狀態中所儲存的物件,或是已經從遠端方法呼叫或 Web 服務傳回的物件。

使用下列其中一個方法可將該物件附加到物件內容:

成員 說明

System.Data.Objects.ObjectSet.AddObject(

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

將物件及其相關物件加入至 ObjectContext 並將實體物件設定為 Added 狀態。在這個狀態下,實體物件不需要具備唯一的索引鍵值。儲存物件之後,暫存的索引鍵值會指派給索引鍵屬性,然後再更新為資料來源產生之值。在加入物件之後,請適當變更實體物件的狀態。

System.Data.Objects.ObjectSet.Attach(

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

AttachTo

將物件加入至 ObjectContext 並將物件設定為 Unchanged 狀態。在 Unchanged 狀態下,Entity Framework 會將實體索引鍵值視為最終的值。如果特定型別的多個實體具有相同的索引鍵值,Entity Framework 將會擲回例外狀況。若要避免得到例外狀況,請使用 AddObject 方法來附加已中斷連結的物件,然後適當變更狀態。

物件會附加到 Unchanged 狀態下的物件內容。如果因為您知道已中斷連結狀態中的物件已修改,所以必須變更物件的狀態或關聯性,請使用下列其中一種方法。

成員 描述

ChangeObjectState

將實體或關聯性變更為新狀態 (例如 AddedModified)。這項變更可能會影響實體所參與的關聯性。例如,將實體移至 Added 狀態也會將任何未變更的關聯性移至 Added 狀態。同樣地,將實體標示為 Modified 會將所有純量值標示為 Modified

您也可以使用 ObjectStateEntryChangeState 方法。

ChangeRelationshipState

將兩個實體之間現有的關聯性變更為指定的狀態。如果兩個實體之間沒有關聯性,這個方法會依指定的狀態建立新的關聯性。以外部索引鍵關聯為基礎的關聯性不支援這個方法。如需詳細資訊,請參閱定義及管理關聯性

您也可以使用 ObjectStateEntryChangeObjectState 方法。

ChangeState

這個方法的行為會和 ChangeObjectStateChangeRelationshipState 相同,需視 ObjectStateEntry 是一個物件或關聯性而定。

SetModifiedProperty

將個別屬性設定為 Modified 狀態。當您知道哪些屬性已修改時請使用這個方法,而不是將整個實體設定為已修改。

如果附加的物件具有更新的屬性值,請使用下列其中一個方法:

成員 說明

System.Data.Objects.ObjectSet.ApplyCurrentValues(

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

將純量值從提供的物件複製到 ObjectContext 中具有相同索引鍵的物件。任何與原始值不同的值將標示為已修改。

如果您有一個使用目前值的圖形,而您想要套用原始值,請呼叫 ApplyOriginalValues 方法。

您也可以使用 ObjectStateEntryApplyCurrentValues 方法。

System.Data.Objects.ObjectSet.ApplyOriginalValues(

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

從提供的物件將純量值複製至 ObjectContext 中具有相同索引鍵之物件的原始值組。任何與目前值不同的值將標示為已修改。

您也可以使用 ObjectStateEntryApplyOriginalValues 方法。

SetModifiedProperty

將個別屬性設定為 Modified 狀態。當您知道哪些屬性已修改時請使用這個屬性,而不是將整個實體設定為已修改。

GetUpdatableOriginalValues

取得 OriginalValueRecord 執行個體,其代表與這個 ObjectStateEntry 關聯之物件的原始值的可更新版本。使用傳回之 OriginalValueRecord 執行個體來個別讀取或更新物件的原始屬性。

CurrentValues

取得 CurrentValueRecord 執行個體,其代表與這個 ObjectStateEntry 關聯之物件的目前值。使用傳回之 CurrentValueRecord 執行個體來個別讀取或更新物件的目前屬性。

附加物件的考量因素

下列考量適用於附加物件到物件內容時:

  • 如果附加的物件有相關物件,這些物件也會附加到物件內容。

  • 如果附加的物件不在資料來源中,SaveChanges 期間就不會將它加入。在此情況下對屬性進行變更時,會在 SaveChanges 期間於伺服器上發生例外狀況。若要加入物件,請使用 System.Data.Objects.ObjectSet.AddObject(System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

    如果附加的物件與其他物件有關,您必須使用定義及管理關聯性中所述的其中一種方法來明確定義關聯性。如需詳細資訊,請參閱 HOW TO:附加相關的物件 (Entity Framework)

  • 傳遞給 Attach 方法的物件必須具有有效的 EntityKey 值。如果此物件的 EntityKey 值無效,請使用 AttachTo 方法來指定實體集的名稱。

  • 當附加的物件與物件內容中存在的其他物件具有相同的 EntityKey 時,就會發生 InvalidOperationException。如果內容中的物件具有相同索引鍵但處於 Added 狀態,則不會發生這個錯誤。

中斷連結物件

在 Entity Framework 應用程式中,您可以將物件與物件內容中斷連結。您可能會中斷連結物件以節省資源,因為在相同的物件內容中執行重複的查詢會增加物件內容的記憶體需求。您可以讓物件不要附加至物件內容,只要執行使用 NoTrackingMergeOption 值之查詢,或者您可以透過呼叫 System.Data.Objects.ObjectSet.Detach(System.Data.Objects.ObjectContext.Detach(System.Object) 方法並傳遞要中斷連結之物件的參考,來中斷連結物件,如下列範例所示:

' Detach the first SalesOrderDetail in the collection. 
context.Detach(order.SalesOrderDetails.First())
// Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First());

中斷連結物件的考量因素

下列考量適用於中斷連結物件時:

  • Detach 只會影響傳遞給此方法的特定物件。如果中斷連結的物件在物件內容中有相關物件,這些物件並不會中斷連結。

  • 在獨立關聯中,中斷連結的物件並不會維護關聯性資訊。

  • 當物件中斷連結時,並不會維護物件狀態資訊。其中包括追蹤的變更和暫時性的索引鍵值。

  • 中斷連結物件不會影響資料來源中的資料。

  • 在中斷連結作業期間,不會強制執行識別關聯性中之串聯 (Cascade) 刪除指示詞和參考條件約束 (Constraint)。

  • 雖然中斷物件連結確實有好處,但是也應該要考量執行此作業所需的額外處理。當使用者資料的範圍變更之後 (例如顯示具有不同資料集的新表單),您應該考慮建立新的 ObjectContext 執行個體,而不要只是將物件與現有的 ObjectContext 中斷連結。

如需詳細資訊,請參閱 HOW TO:從物件內容中斷物件的連結 (Entity Framework)

本章節內容

HOW TO:附加相關的物件 (Entity Framework)

HOW TO:套用對中斷連結的物件所做的變更 (Entity Framework)

HOW TO:從物件內容中斷物件的連結 (Entity Framework)

另請參閱

概念

建置 N-Tier 應用程式