設計工具資料表分割

本逐步解說示範如何使用 Entity Framework Designer 修改模型,將多個實體類型對應至單一資料表。

您可能想要使用資料表分割的其中一個原因是在使用延遲載入來載入物件時延遲載入某些屬性。 您可以將可能包含非常大量資料的屬性分隔成個別實體,並只在必要時載入它。

下圖顯示使用 EF 設計工具時所使用的主要視窗。

EF Designer

必要條件

若要完成這個逐步解說,您將需要:

設定專案

本逐步解說是使用 Visual Studio 2012。

  • 開啟 Visual Studio 2012。
  • [檔案] 功能表上,指向 [開新檔案] ,然後按一下 [專案]
  • 在左窗格中,按一下 [Visual C#],然後選取 [主控台應用程式] 範本。
  • 輸入 TableSplittingSample 作為專案的名稱,然後按一下 [ 確定 ]。

根據學校資料庫建立模型

  • 以滑鼠右鍵按一下方案總管中的專案名稱,指向 [ 新增 ],然後按一下 [ 新增專案 ]。
  • 從左側功能表中選取 [資料 ],然後在 [範本] 窗格中選取 [ADO.NET 實體資料模型 ]。
  • 輸入 TableSplittingModel.edmx 以取得檔案名,然後按一下 [ 新增 ]。
  • 在 [選擇模型內容] 對話方塊中,選取 [從資料庫 產生],然後按 [下一步]。
  • 按一下 [新增連線。 在 [連線ion 屬性] 對話方塊中,輸入伺服器名稱 (例如 , localdb)\mssqllocaldb ),選取驗證方法,輸入 School 以取得資料庫名稱,然後按一下 [ 確定 ]。 [選擇您的資料連線] 對話方塊會使用您的資料庫連線設定來更新。
  • 在 [選擇資料庫物件] 對話方塊中,展開 [ 資料表 ] 節點,然後檢查 Person 資料表。 這會將指定的資料表新增至 School 模型。
  • 按一下完成

[實體設計工具] 會顯示為編輯模型提供設計介面。 您在 [ 選擇資料庫物件 ] 對話方塊中選取的所有物件都會新增至模型。

將兩個實體對應至單一資料表

在本節中,您會將 Person 實體分割成兩個實體,然後將它們對應至單一資料表。

注意

Person 實體不包含任何可能包含大量資料的屬性;它只是用來做為範例。

  • 以滑鼠右鍵按一下設計介面的空白區域,指向 [ 新增] ,然後按一下 [ 實體 ]。 [ 新增實體 ] 對話方塊隨即出現。
  • 輸入 HireInfo 取得 [機構名稱 ] 和 [Key 屬性 名稱] 的 PersonID
  • 按一下 [確定]
  • 在設計介面上便會建立並顯示新的實體類型。
  • 選取 Person 實體類型的 HireDate 屬性 ,然後按 Ctrl+X 鍵。
  • 選取 HireInfo 實體,然後按 Ctrl+V 鍵。
  • 建立 Person HireInfo 之間的 關聯。 若要這樣做,請以滑鼠右鍵按一下設計介面的空白區域,指向 [ 新增 ],然後按一下 [ 關聯 ]。
  • [ 新增關聯] 對話方塊隨即出現。 PersonHireInfo 名稱預設為指定。
  • 在關聯性兩端指定多重性 1(One)。
  • 按 [確定]

下一個步驟需要 [ 對應詳細資料 ] 視窗。 如果您看不到此視窗,請以滑鼠右鍵按一下設計介面,然後選取 [ 對應詳細資料 ]。

  • 選取 HireInfo 實體類型,然後按一下 < [對應詳細 資料] 視窗中的 [新增資料表] 或 [檢視 > ]。

  • 從 [ < 新增資料表] 或 [檢視 > ] 欄位下拉式清單中選取 [人員 ]。 此清單包含可對應所選實體的資料表或檢視表。 根據預設,應該對應適當的屬性。

    Mapping Properties

  • 選取 設計介面上的 PersonHireInfo 關聯。

  • 以滑鼠右鍵按一下設計介面上的關聯,然後選取 [ 屬性 ]。

  • 在 [ 屬性] 視窗中,選取 [引用條件約束 ] 屬性,然後按一下省略號按鈕。

  • 從 [主體 ] 下拉式清單中選取 [人員 ]。

  • 按 [確定]

 

使用模型

  • 將下列程式碼貼到 Main 方法中。
    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 語句會針對 School 資料庫執行。 

  • 執行內容時,執行下列 INSERT 。SaveChanges() 和結合 Person HireInfo 實體的資料

    Insert Combining Person and HireInfo Data

  • 因為執行 coNtext.人員,所以執行了下列 SELECT 。FirstOrDefault() 並只選取對應至 Person 的資料行

    Select 1

  • 因為存取 existingPerson.Instructor 的導覽屬性而執行下列 SELECT ,並只選取對應至 HireInfo 的資料行

    Select 2