設計實體拆分

本教學示範如何透過 Entity Framework Designer(EF Designer)修改模型,將實體類型映射到兩個資料表。 當一個實體共享一個共同的金鑰時,你可以將一個實體映射到多個資料表。 適用於將實體類型映射到兩個資料表的概念,也很容易擴展到將實體類型映射到超過兩個資料表。

下圖顯示使用 EF Designer 時主要使用的視窗。

EF Designer

先決條件

Visual Studio 2012 或 Visual Studio 2010、Ultimate、Premium、Professional 或 Web Express 版本。

建立資料庫

安裝於 Visual Studio 的資料庫伺服器會依你安裝的 Visual Studio 版本而有所不同:

  • 如果你用的是 Visual Studio 2012,那你就是要建立一個 LocalDB 資料庫。
  • 如果你用的是 Visual Studio 2010,你會建立一個 SQL Express 資料庫。

首先,我們會建立一個包含兩個資料表的資料庫,並將這些資料表合併成一個實體。

  • 開啟 Visual Studio
  • 檢視 -> 伺服器檔案總管
  • 右鍵點擊 資料連線 -> 新增連線...
  • 如果你之前沒從 Server Explorer 連接過資料庫,你需要選擇 Microsoft SQL Server 作為資料來源
  • 取決於你安裝的是 LocalDB 還是 SQL Express,進行相應的連接。
  • 資料庫名稱輸入 EntitySplitting
  • 選擇 確定 ,系統會詢問你是否要建立新的資料庫,請選擇 「是」
  • 新資料庫現在會出現在伺服器檔案總管中
  • 如果你正在使用 Visual Studio 2012
    • 在伺服器檔案總管中右鍵點擊資料庫,選擇 新查詢
    • 將以下 SQL 複製到新查詢中,然後右鍵點擊查詢並選擇 執行
  • 如果你正在使用 Visual Studio 2010
    • 選擇 資料 -> Transact SQL 編輯器 -> 新查詢連線...
    • 輸入 .\SQLEXPRESS 作為伺服器名稱,然後點擊 確定
    • 從查詢編輯器頂端的下拉選單選擇 EntitySplitting 資料庫
    • 將以下 SQL 複製到新查詢中,然後右鍵點擊查詢並選擇 執行 SQL
CREATE TABLE [dbo].[Person] (
[PersonId] INT IDENTITY (1, 1) NOT NULL,
[FirstName] NVARCHAR (200) NULL,
[LastName] NVARCHAR (200) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC)
);

CREATE TABLE [dbo].[PersonInfo] (
[PersonId] INT NOT NULL,
[Email] NVARCHAR (200) NULL,
[Phone] NVARCHAR (50) NULL,
CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ([PersonId] ASC),
CONSTRAINT [FK_Person_PersonInfo] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([PersonId]) ON DELETE CASCADE
);

創建專案

  • 在 [檔案] 功能表上,指向 [開新檔案] ,然後按一下 [專案] 。
  • 在左側窗格點選 Visual C#,然後選擇 Console Application 範本。
  • 輸入 MapEntityToTablesSample 作為專案名稱,並點擊 確定。
  • 如果有提示,請點擊 「否」 以儲存在第一部分建立的 SQL 查詢。

根據資料庫建立模型

  • 在解決方案總管中右鍵點擊專案名稱,指向 新增,然後點 選新項目。
  • 從左側選單選擇 「資料 」,然後在範本欄 ADO.NET 選擇實體資料模型 。
  • 輸入 MapEntityToTablesModel.edmx 作為檔名,然後點 選新增。
  • 在「選擇模型內容」對話框中,選擇 「從資料庫產生」,然後點擊 「下一步」。
  • 從下拉選單選擇 EntitySplitting 連線,然後點 選「下一步」。
  • 在「選擇你的資料庫物件」對話框中,勾選「 表格 」節點旁的方框。 這會將 EntitySplitting 資料庫中的所有資料表加入模型。
  • 按一下完成。

實體設計器(Entity Designer)會顯示用於編輯模型的設計表面。

將一個實體映射到兩個資料表

在此步驟中,我們將更新 Person 實體類型,以合併 Person 與 PersonInfo 資料表的資料。

  • 選擇 **PersonInfo **entity 的 電子郵件 與 電話 屬性,並按 Ctrl+X 鍵。

  • 選擇 **Person **entity,然後按 Ctrl+V 鍵。

  • 在設計表面,選擇 PersonInfo 實體,並按下 鍵盤上的刪除 按鈕。

  • 請點選否,當被問及是否要從模型中移除PersonInfo表格時,我們即將把它映射到Person實體。

    刪除資料表

接下來的步驟需要進入 地圖細節 視窗。 如果你看不到這個視窗,請右鍵點擊設計曲面並選擇 「映射細節」。

  • 選擇「個人實體類型」,並在<視窗中點選>「新增表格或視圖」。
  • 從下拉選單中選擇 **PersonInfo **。 映射 細節 視窗會更新預設欄位映射,這對我們的情境來說是合適的。

Person 實體類型現在映射到 Person 和 PersonInfo 資料表。

映射2

運用該模型

  • 將以下程式碼貼入主方法。
    using (var context = new EntitySplittingEntities())
    {
        var person = new Person
        {
            FirstName = "John",
            LastName = "Doe",
            Email = "john@example.com",
            Phone = "555-555-5555"
        };

        context.People.Add(person);
        context.SaveChanges();

        foreach (var item in context.People)
        {
            Console.WriteLine(item.FirstName);
        }
    }
  • 編譯並執行應用程式。

執行此應用程式後,對資料庫執行了以下 T-SQL 語句。 

  • 接下來兩個 INSERT 語句是執行上下文的結果。SaveChanges()。 他們會從 Person 實體取得資料,並分配到 Person 和 PersonInfo 兩個資料表。

    插入 1

    插入 2

  • 以下 SELECT 是透過列舉資料庫中的人物而執行的。 它結合了 Person 和 PersonInfo 資料表的資料。

    選擇合併個人資料與個人資訊資料