設計工具實體分割
本逐步解說示範如何使用 Entity Framework Designer 修改模型,將實體類型對應至兩個數據表。 當多個資料表共用共同的索引鍵時,您可以將實體對應至多個資料表。 套用至將實體類型對應至兩個數據表的概念,可以輕鬆地擴充為將實體類型對應至兩個以上的資料表。
下圖顯示使用 EF 設計工具時所使用的主要視窗。
必要條件
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 實體。
後續步驟需要 [ 對應詳細資料 ] 視窗。 如果您看不到此視窗,請以滑鼠右鍵按一下設計介面,然後選取 [ 對應詳細資料 ]。
- 選取 [ 人員 ] 實體類型,然後按一下 < [對應詳細 資料] 視窗中的 [新增資料表] 或 [檢視 > ]。
- 從下拉式清單中選取 [PersonInfo] 。 [ 對應詳細 資料] 視窗會使用預設資料行對應來更新,這些適用于我們的案例。
Person 實體類型現在會對應至 Person 和 PersonInfo 資料表。
使用模型
- 將下列程式碼貼到 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 資料表之間。
下列 SELECT 會因為列舉資料庫中的人員而執行。 它會結合 Person 和 PersonInfo 資料表中的資料 。