建立、加入、修改和刪除物件
物件內容中的物件是表示資料來源中資料之實體型別的執行個體 (Instance)。 您可以修改、建立及刪除物件內容中的物件,而 Entity Framework 會追蹤對這些物件所做的變更。 當呼叫 SaveChanges 方法時,Entity Framework 會產生及執行一些命令,這些命令會對資料來源執行同等的插入、更新或刪除陳述式 (Statement)。 如需詳細資訊,請參閱儲存變更及管理並行存取 (Entity Framework)。
將插入、更新和刪除函式對應至預存程序
Entity Framework 可讓您將實體類型的插入、更新和刪除作業對應至預存程序。 如果您打算將預存程序對應至實體,建議您對應這三項作業。 例如,如果您將實體類型對應至插入和更新預存程序,但沒有對應至刪除預存程序卻試著刪除該類型的物件,則刪除作業在執行階段將會失敗而發生 UpdateException。 如需詳細資訊,請參閱 How to: Map Modification Functions to Stored Procedures和Walkthrough: Mapping an Entity to Stored Procedures。
建立和加入物件
當您要在資料來源中插入資料時,必須建立實體類型的執行個體,並且將物件加入至物件內容。 在您可以將新物件儲存至資料來源之前,您必須先設定不支援 null 值的所有屬性。 使用 Entity Framework 產生之類別時,請考慮使用實體類型的靜態 CreateObjectName 方法來建立實體類型的新執行個體。 實體資料模型 工具在產生實體類型時會在每個類別中都包含這個方法。 這個建立方法是用來建立物件的執行個體,並設定不可為 null 之類別的所有屬性。 這個方法會針對 CSDL 檔案中已套用 Nullable="false"
屬性 (Attribute) 的每個屬性 (Property) 都包含參數。 如需詳細資訊,請參閱 HOW TO:使用靜態 Create 方法建立物件 (Entity Framework)。
在處理 POCO (「單純」的 CLR 物件) 實體時,請使用 CreateObject 方法來建立新物件,而非使用 new 運算子。 CreateObject 方法會將新的 POCO 執行個體包裝在適當的 Proxy 物件中。 如需詳細資訊,請參閱使用 POCO 實體 (Entity Framework)。
您可以使用下列其中一種方法來將新物件加入至物件內容:
ObjectContext 上的 AddObject 方法。
EntityCollection 上的 Add 方法。 若是 Entity Framework 產生的實體和 POCO Proxy 物件,在附加主體物件時,會將已加入的實體附加至內容。 POCO 實體會在呼叫 DetectChanges 方法時附加。
下列考量適用於加入新物件的情況:
在呼叫 SaveChanges 之前,Entity Framework 會為每個新物件產生暫存索引鍵值。 在呼叫 SaveChanges 之後,當插入新的資料列時,資料來源指派的識別值會取代該索引鍵值。
如果資料庫未產生實體的索引鍵值,您應該指派唯一值。 如果兩個物件擁有之使用者指定的機碼值相同,則當呼叫 SaveChanges 時會發生 InvalidOperationException。 如果發生此情況,您應該指派唯一的值,並重試作業。
將物件加入至特定 EntitySet
可能會發生實體型別屬於多個實體集的狀況。 例如,假設有一個狀況是資料庫的兩個資料表具有相同的結構描述。 如果您想要分割資料來產生更有效率的備份程序,可能會發生這種情況。 例如,您可能具有在 Customer 與 CustomerArchive 資料表之間分割的客戶資料,其中 CustomerArchive 具有的結構描述與 Customer 相同,但是用於六個月以上未下訂單的客戶。Customer 可能每個晚上都會備份,而 CustomerArchive 則只會每週備份。 從對應的觀點來看,Customer 和 CustomerArchive 必須屬於不同的實體集。 Entity Framework 讓實體類型存在於一個或多個實體集之中,藉此支援這個案例。 如需詳細資訊,請參閱EntitySet 項目 (CSDL)。
當實體類型存在於多個實體集內時,Entity Framework 可讓您將此類型的新執行個體加入至特定實體集。 從 .NET Framework 4 版開始,針對特定模型產生的 ObjectContext 類別會具有代表模型之實體集的 ObjectSet 型別的屬性。 使用 AddObject 方法來將新物件加入至物件內容。 如需詳細資訊,請參閱使用 ObjectSet (Entity Framework)。 在 .NET Framework 3.5 SP1 版中,當您呼叫 AddObject 方法來將物件加入至物件內容時,必須指定 entitySetName 的值。
修改物件
Entity Framework 會追蹤附加至 ObjectContext 之物件的變更。 實體資料模型 工具會產生一對部分方法,名稱為 OnPropertyChanging 和 OnPropertyChanged。 這兩個方法會在屬性 setter 中被呼叫。 請在部分類別中擴充這些方法,以便在屬性變更期間插入自訂商務邏輯。 如需詳細資訊,請參閱 HOW TO:在純量屬性變更期間執行商務邏輯 (Entity Framework)。 如需使用 POCO 實體的指引,請參閱追蹤 POCO 實體中的變更 (Entity Framework)。
下列考量適用於修改物件的情況:
當複雜物件的任何純量或複雜屬性發生變更時,最上層實體物件的狀態會變更成 Modified。 在不符合 Proxy 產生之需求 (描述於建立 POCO Proxy 的需求 (Entity Framework)中) 的 POCO 實體中,在呼叫 DetectChanges 方法時,已修改之屬性的狀態會變更為 Modified。
當物件處於 Detached 狀態時,變更不會被追蹤。 物件在由使用 NoTracking 合併選項的查詢傳回的時候,或在藉由呼叫 Detach 從 ObjectContext 中斷連結之後,會處於這個狀態。
當您變更外部索引鍵關聯時,相依物件的狀態會變更為 Modified。 當您變更獨立關聯時,相依物件的狀態並不會變更。
如需在 POCO 實體中追蹤變更的詳細資訊,請參閱追蹤 POCO 實體中的變更 (Entity Framework)。
刪除物件
呼叫 ObjectSet 上的 DeleteObject,或呼叫 ObjectContext 上的 DeleteObject 方法會標示要刪除的指定物件。 直到呼叫 SaveChanges 之後,才會從資料來源中刪除資料列。
當刪除的實體物件與其他實體之間有關聯時,以下事項必須列入考量:
當處理外部索引鍵關聯時,Entity Framework 會在刪除主體物件時,將相依物件之可為 Null 的外部索引鍵屬性設定為 null。
當主體實體的主索引鍵為相依實體之主索引鍵的一部分時,刪除主體物件也會刪除所有載入的相依物件。 這與針對關聯性定義串聯刪除規則相同。
關聯性的串聯刪除規則
當您想要在父記錄已刪除時自動刪除它的所有子記錄時,您可以指定串聯刪除規則。 強烈建議您同時在概念模型和資料庫中指定串聯刪除規則。 必須同時在資料庫和模型中指定串聯刪除規則是因為 Entity Framework 只會刪除記憶體中所載入的物件。 例如,如果您已經載入包含部分子系但不是所有子系的父系,則當您刪除該父系時,只會刪除記憶體中所載入的子系。 這表示,除非您在資料庫中指定了對應的串聯刪除規則,否則失去關聯的記錄可能會留在資料庫中,或者刪除作業可能會因為潛在的外部索引鍵條件約束違規而失敗。
當您處理獨立的關聯時,除非您執行下列其中一項動作,否則串聯刪除作業在一對一或是一對零或一的關聯性中可能會失敗:
在內容中載入一對一或是一對零或一關聯性的兩端。 如需詳細資訊,請參閱載入相關的物件 (Entity Framework)。
如果在查詢物件時,關聯性的另一端具有一或是零或一的多重性,請將合併選項設定為 NoTracking,然後將物件附加至內容。 在此情況下,資料庫將會執行串聯刪除。
如需詳細資訊,請參閱串聯刪除及一對一 (或是一對零/一) 關聯性 (英文)。
定義串聯刪除規則
在 Entity Framework 中,串聯規則是由存放結構定義語言 (SSDL) 和概念結構定義語言 (CSDL) 中的 OnDelete 元素所定義。 如需詳細資訊,請參閱 OnDelete 項目 (CSDL) 和 OnDelete 項目 (SSDL)。
在 SQL Server 資料庫中,您可以使用 SQL Server Management Studio 設定串聯規則。 若要設定該規則,請在 [資料庫圖表] 視窗中顯示相關的資料表。 請選取關聯性,並按 F4 顯示 [屬性] 視窗。 在 [屬性] 視窗中,將 [INSERT 及 UPDATE 規格] 屬性底下的 [刪除規則] 設定為 [Cascade]。 當您從資料庫產生模型時,串聯規則就會匯入模型中。
提示: |
---|
如果您使用串聯刪除規則來更新資料庫,然後從資料庫更新現有的模型,則 Entity Framework 會將串聯刪除規則加入至 SSDL 而不是 CSDL。 您必須手動將它加入。 若要在概念模型中指定串聯刪除規則,請在 Entity Designer 介面上選取關聯。 然後在 [屬性] 視窗中,選取 OnDelete 屬性的 Cascade。 |
本章節內容
HOW TO:加入、修改和刪除物件 (Entity Framework)
HOW TO:使用靜態 Create 方法建立物件 (Entity Framework)
另請參閱
工作
HOW TO:使用每個類型的多重實體來定義模型 (Entity Framework)
HOW TO:加入、修改和刪除物件 (Entity Framework)
概念
定義及管理關聯性
使用 POCO 實體 (Entity Framework)
使用 ObjectSet (Entity Framework)
使用 ObjectSet (Entity Framework)
OnDelete 項目 (CSDL)