共用方式為


對象狀態和 Change-Tracking

LINQ to SQL 物件一律會參與某些 狀態。 例如,當 LINQ to SQL 建立新的物件時,對象會處於 Unchanged 狀態。 您自己建立的新物件對 DataContext 未知且處於 Untracked 狀態。 成功執行 SubmitChanges之後,LINQ to SQL 已知的所有物件都處於 Unchanged 狀態。 (唯一的例外是那些已成功從資料庫刪除的項目,這些項目處於Deleted狀態,在該DataContext實例中無法使用。)

對象狀態

下表列出 LINQ to SQL 物件的可能狀態。

說明
Untracked LINQ to SQL 未追蹤的物件。 範例包括下列各項:

- 未透過當前 DataContext 查詢的物件(例如新創建的物件)。
- 透過還原序列化建立的物件
- 透過不同的 DataContext查詢物件。
Unchanged 使用目前 DataContext 所擷取的物件,且不明是否自建立後曾被修改。
PossiblyModified 連接DataContext的物件。 如需詳細資訊,請參閱多層式應用程式中的數據擷取和 CUD 作業(LINQ to SQL)。
ToBeInserted 未使用目前 DataContext擷取的物件。 這將導致資料庫INSERTSubmitChanges期間。
ToBeUpdated 已知自擷取後已被修改的一個物件。 這將導致資料庫UPDATESubmitChanges期間。
ToBeDeleted 標示要刪除的物件,在 期間DELETE造成資料庫SubmitChanges
Deleted 資料庫中已刪除的物件。 此狀態是最終狀態,不允許進行其他轉換。

插入物件

您可以明確地要求Inserts使用InsertOnSubmit。 或者 LINQ to SQL 可以透過尋找與必須更新的已知物件之一連結的物件來推斷 Inserts。 例如,如果您將 Untracked 物件新增至 EntitySet<TEntity> 或將 EntityRef<TEntity> 設定為 Untracked 物件,便使得 Untracked 物件可透過圖形中的追蹤物件到達。 處理 SubmitChanges 時,LINQ to SQL 會周遊已追蹤的物件,並探索任何未追蹤,但可訪問的持久性物件。 這類物件是插入資料庫中的候選專案。

對於繼承階層中的類別, InsertOnSubmito) 也會設定指定為 歧視性 的成員值,以符合 物件的 o型別。 如果類型符合預設的歧視性值,此動作會導致使用預設值覆寫歧視性值。 如需詳細資訊,請參閱 繼承支援

這很重要

加入至 Table 的物件不在識別記憶快取中。 識別快取只會反映從資料庫擷取的內容。 呼叫 InsertOnSubmit 之後,新增的實體不會出現在資料庫的查詢中,直到 SubmitChanges 成功完成。

刪除物件

您可以在適當的 o上呼叫 DeleteOnSubmit(o) 來標記追蹤的物件Table<TEntity>以進行刪除。 LINQ to SQL 會將 物件的 EntitySet<TEntity> 移除視為更新作業,而對應的外鍵值會設定為 null。 作業的目標 (o) 不會從其資料表中刪除。 例如,cust.Orders.DeleteOnSubmit(ord) 表示一次更新,將外鍵 cust 設定為 null,從而切斷 ordord.CustomerID 之間的關聯性。 它不會刪除對應至 ord的數據列。

當物件從資料表中刪除時DeleteOnSubmit,LINQ to SQL 會執行下列處理:

  • 當呼叫 SubmitChanges 時,DELETE 會針對該物件執行作業。

  • 不論這些物件是否已載入,移除將不會影響相關物件。 具體而言,不會載入相關物件來更新關聯性屬性。

  • 成功執行 SubmitChanges之後,物件會設定為 Deleted 狀態。 因此,您無法在該 id中使用 物件或其 DataContextDataContext 實例所維護的內部快取不會移除已擷取或新增的物件,即使這些物件已在資料庫中被刪除。

您只能呼叫 DeleteOnSubmitDataContext 追蹤的物件上。 在Untracked物件中,您必須先呼叫Attach,才能呼叫DeleteOnSubmit。 提出 DeleteOnSubmitUntracked 物件上會拋出例外狀況。

備註

從數據表中移除物件時,LINQ to SQL 會在DELETE的時間產生對應的 SQL SubmitChanges命令。 此動作不會從快取中移除物件,也不會將刪除傳播至相關物件。

若要回收已刪除物件的 id,請使用新的 DataContext 實例。 若要清除相關物件,您可以使用資料庫的 串聯刪除 功能,或手動刪除相關物件。

相關物件不需要以任何特殊順序刪除(不同於資料庫中)。

更新物件

您可以藉由觀察變更的通知來偵測 Updates 。 通知是透過 PropertyChanging 屬性 setter 中的 事件來提供。 當 LINQ to SQL 收到物件第一次變更的通知時,它會建立對象的複本,並將對象視為產生 Update 語句的候選物件。

對於未實 INotifyPropertyChanging作 的物件,LINQ to SQL 會維護物件第一次具體化時所擁有值的複本。 當您呼叫 SubmitChanges時,LINQ to SQL 會比較目前和原始值,以決定物件是否已變更。

若要更新關係,子項對父項的參考(即對應至外鍵的參考)被視為權威。 反向方向的參考(也就是從父系到子系)是選擇性的。 關聯性類別 (EntitySet<TEntity>EntityRef<TEntity>) 保證雙向參考一致,適用於一對多和一對一關聯性。 如果物件模型不使用 EntitySet<TEntity>EntityRef<TEntity>,而且如果存在反向參考,則您必須負責在更新關聯性時與正向參考保持一致。

如果您同時更新必要的引用和相應的外鍵,您必須確保它們一致。 如果您在呼叫 InvalidOperationException時兩者SubmitChanges未同步處理,則會擲回例外狀況。 雖然外鍵值變更足以影響基礎數據列的更新,但您應該變更參考,以維持物件圖形的連線能力和關聯性的雙向一致性。

另請參閱