設計工具實體分割

本逐步解說示範如何使用 Entity Framework Designer 修改模型,將實體類型對應至兩個數據表。 當多個資料表共用共同的索引鍵時,您可以將實體對應至多個資料表。 套用至將實體類型對應至兩個數據表的概念,可以輕鬆地擴充為將實體類型對應至兩個以上的資料表。

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

EF Designer

必要條件

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

建立資料庫

隨 Visual Studio 一起安裝的資料庫伺服器會根據您安裝的 Visual Studio 版本而有所不同:

  • 如果您使用 Visual Studio 2012,您將建立 LocalDB 資料庫。
  • 如果您使用 Visual Studio 2010,您將建立 SQL Express 資料庫。

首先,我們將建立一個資料庫,其中包含兩個要合併成單一實體的資料表。

  • 開啟 Visual Studio
  • 檢視 - > 伺服器總管
  • 以滑鼠右鍵按一下 [資料連線 - > 新增連線...
  • 如果您尚未從 [伺服器總管] 連線到資料庫,則必須先選取 [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# ],然後選取 [主控台應用程式 ] 範本。
  • 輸入 MapEntityToTablesSample 作為專案的名稱,然後按一下 [ 確定 ]。
  • 如果系統提示您儲存在第一節中建立的 SQL 查詢,請按一下 [否 ]。

根據資料庫建立模型

  • 以滑鼠右鍵按一下方案總管中的專案名稱,指向 [ 新增 ],然後按一下 [ 新增專案 ]。
  • 從左側功能表中選取 [資料 ],然後在 [範本] 窗格中選取 [ADO.NET 實體資料模型 ]。
  • 輸入 MapEntityToTablesModel.edmx 的檔案名,然後按一下 [ 新增 ]。
  • 在 [選擇模型內容] 對話方塊中,選取 [從資料庫 產生],然後按 [下一步]。
  • 從下拉式清單中選取 [EntitySplitting 連線],然後按 [下一步 ]。
  • 在 [選擇資料庫物件] 對話方塊中,核取 [資料表 ] 節點旁的 方塊。 這會將 EntitySplitting 資料庫的所有資料表 新增至模型。
  • 按一下完成

[實體設計工具] 會顯示為編輯模型提供設計介面。

將實體對應至兩個數據表

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

  • 選取 **PersonInfo ** 實體的電子郵件和 電話 屬性,然後按 Ctrl+X 鍵。

  • 選取 [人員] 實體,然後按 Ctrl+V 鍵。

  • 在設計介面上,選取 PersonInfo 實體,然後按 鍵盤上的 [刪除] 按鈕。

  • 當系統詢問您是否要從模型中移除 PersonInfo 資料表時,按一下 [否 ],我們將它對應至 Person 實體。

    Delete Tables

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

  • 選取 [ 人員 ] 實體類型,然後按一下 < [對應詳細 資料] 視窗中的 [新增資料表] 或 [檢視 > ]。
  • 從下拉式清單中選取 [PersonInfo] 。 [ 對應詳細 資料] 視窗會使用預設資料行對應來更新,這些適用于我們的案例。

Person 實體類型現在會對應至 Person PersonInfo 資料表。

Mapping 2

使用模型

  • 將下列程式碼貼到 Main 方法中。
    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 資料表之間。

    Insert 1

    Insert 2

  • 下列 SELECT 會因為列舉資料庫中的人員而執行。 它會結合 Person 和 PersonInfo 資料表中的資料

    Select Combining Person and PersonInfo Data