本教學展示了如何透過 Entity Framework Designer(EF Designer)修改模型,將多個實體類型映射到單一表格。
你可能想要使用表格拆分的原因之一是在使用延遲載入來載入物件時,延遲某些屬性的載入。 你可以把可能包含大量資料的屬性分成獨立實體,只有在需要時才載入。
下圖顯示使用 EF Designer 時主要使用的視窗。
先決條件
若要完成這個逐步解說,您將需要:
- 最新版的 Visual Studio。
- School 範例資料庫。
設定專案
此攻略使用 Visual Studio 2012。
- 開啟 Visual Studio 2012。
- 在 [檔案] 功能表上,指向 [開新檔案] ,然後按一下 [專案] 。
- 在左側窗格點選 Visual C#,然後選擇 Console Application 範本。
- 輸入 TableSplittingSample 作為專案名稱,然後點選 確定。
根據學校資料庫建立模型
- 在解決方案總管中右鍵點擊專案名稱,指向 新增,然後點 選新項目。
- 從左側功能表中選取 [數據 ],然後在 [範本] 窗格中選取 [ADO.NET 實體數據模型 ]。
- 輸入 TableSplittingModel.edmx 作為檔名,然後點 選新增。
- 在「選擇模型內容」對話框中,選擇 「從資料庫產生」,然後點擊 「下一步」。
- 點擊新連線。 在 [連線屬性] 對話框中,輸入伺服器名稱 (例如 , localdb)\mssqllocaldb),選取驗證方法,輸入 School 以取得資料庫名稱,然後按兩下 [ 確定]。 [選擇您的數據連線] 對話方塊會使用您的資料庫連線設定來更新。
- 在「選擇你的資料庫物件」對話框中,展開 「表格」 節點並勾選 「人物 」資料表。 此時會將指定的表格加入 學校 模型。
- 按一下完成。
實體設計器(Entity Designer)會顯示用於編輯模型的設計表面。 你在 「選擇資料庫物件 」對話框中選擇的所有物件都會被加入模型中。
將兩個實體映射到單一資料表
在這個章節中,你會將 Person 實體拆分成兩個實體,然後將它們映射到單一資料表。
備註
Person 實體不包含可能包含大量資料的屬性;它只是作為例子。
- 右鍵點選設計表面的空白區域,指向 新增,然後點 選實體。 新 實體 對話框會出現。
- 為實體名稱輸入HireInfo,為鍵屬性名稱輸入PersonID。
- 按一下 確定。
- 一個新的實體類型會被建立並在設計表面上顯示。
- 選擇 Person 實體類型的 HireDate 屬性,然後按 Ctrl+X 鍵。
- 選擇 HireInfo 實體,然後按 Ctrl+V 鍵。
- 建立Person與HireInfo之間的關聯。 操作方法是右鍵點擊設計表面的空白區域,指向新增,然後點擊關聯。
- 出現新增關聯對話框。 PersonHireInfo 名稱為預設。
- 在關係的兩端指定重數為1(1)。
- 按 [確定]。
下一步需要進入 「地圖細節 」視窗。 如果你看不到這個視窗,請右鍵點擊設計曲面並選擇 「映射細節」。
選擇 HireInfo 實體類型,然後在 映射詳細資料 視窗中點擊 <新增表格或檢視>。
>」下拉選單中選擇「人物」。 該清單包含可映射所選實體的資料表或檢視。 適當的屬性應預設自動映射。
在設計頁面選擇 PersonHireInfo 關聯。
在設計表面上右鍵點擊關聯,然後選擇 屬性。
在 屬性 視窗中,選擇 參考完整性限制 屬性並按一下省略號按鈕。
從Principal下拉選單中選擇Person。
按 [確定]。
運用該模型
- 將以下程式碼貼入主方法。
using (var context = new SchoolEntities())
{
Person person = new Person()
{
FirstName = "Kimberly",
LastName = "Morgan",
Discriminator = "Instructor",
};
person.HireInfo = new HireInfo()
{
HireDate = DateTime.Now
};
// Add the new person to the context.
context.People.Add(person);
// Insert a row into the Person table.
context.SaveChanges();
// Execute a query against the Person table.
// The query returns columns that map to the Person entity.
var existingPerson = context.People.FirstOrDefault();
// Execute a query against the Person table.
// The query returns columns that map to the Instructor entity.
var hireInfo = existingPerson.HireInfo;
Console.WriteLine("{0} was hired on {1}",
existingPerson.LastName, hireInfo.HireDate);
}
- 編譯並執行應用程式。
執行此應用程式後,對 學校 資料庫執行了以下 T-SQL 語句。
接下來的INSERT操作是由執行context.SaveChanges()所觸發,並且結合Person和HireInfo實體中的資料。
以下 SELECT 是執行上下文的結果。People.FirstOrDefault() 並只選取映射到 Person 的欄位
以下 SELECT 是透過存取 existingPerson.Instructor 導覽屬性所執行,並僅選取映射到 HireInfo 的欄位