逐步解說:將實體對應至多個資料表
本主題示範如何在 Entity Data Model (EDM) 中修改概念模型以將實體類型對應至兩個資料表。當多個資料表共用共同的索引鍵時,您可以將實體對應至多個資料表。適用於將實體類型對應至兩個資料表的概念,很容易擴大為將實體類型對應至兩個以上的資料表。如需將實體對應至多個資料表的詳細資訊,請參閱 How to: Define a Model with Single Entity Mapped to Two Tables。
在本逐步解說中,您將修改 CourseManager 應用程式內使用的 EDM,藉以將實體類型對應至兩個資料表 (如需詳細資訊,請參閱本主題稍後的<必要條件>章節)。您將建立新的實體類型 (Instructor,衍生自 Person 實體類型),並將它對應至 Person 和 OfficeAssignment 資料表。下列步驟概述此程序 (本文件稍後的程序有提供更詳細的資訊)。
建立新實體類型:Instructor。
將 Instructor 的基底類型設為 Person。
注意: 您不必建立繼承階層架構 (Inheritance Hierarchy) 來將實體類型對應至多個資料表。本範例中使用的繼承階層架構更為逼真 (在學校,辦公室只會分配給講師),不用建立 Instructor 實體類型,就有可能將 Person 實體類型對應至 Person 和 OfficeAssignment 資料表。 將 HireDate 屬性從 Person 移至 Instructor。
將 Location 屬性從 OfficeAssignment 移至 Instructor。
使用 HireDate Is Not Null 條件將 Instructor 實體對應至 Person。將 HireDate 資料行對應至 HireDate 屬性。
不使用條件將 Instructor 實體對應至 OfficeAssignment 資料表。將 InstructorID 資料行對應至 PersonID 屬性,並將 Location 資料行對應至 Location 屬性。
刪除 OfficeAssignment 實體類型。
必要條件
若要完成本逐步解說,必須先建置 CourseManager 應用程式。如需詳細資訊,請參閱 Entity Framework 快速入門。您將加入新的實體類型並將它對應至兩個資料表,藉以修改 CourseManager 應用程式中使用的 EDM。然後,您就可以擴充應用程式的功能,以便顯示講師被分配的辦公室。
注意: |
---|
因為本說明文件的許多逐步解說主題都從使用 CourseManager 應用程式開始,建議您為本逐步解說使用 CourseManager 應用程式的複本,而非編輯原始的 CourseManager 程式碼。 |
本逐步解說假設讀者具備以下基本能力:Visual Studio 和 .NET Framework 的使用能力,以及 Visual C# 或 Visual Basic 程式設計的能力。
將實體對應至兩個資料表
在這個程序中,您將建立新的實體類型 (Instructor) 並將它對應至兩個資料表 (Person 和 OfficeAssignment),藉以修改 SchoolModel EDM 的概念部分。
若要將實體對應至兩個資料表
在 Visual Studio 中開啟 CourseManager 方案。
按兩下 [方案總管] 中的 School.edmx 檔案。
School.edmx 檔案隨即在 Entity Data Model Designer (Entity Designer) 中開啟。
以滑鼠右鍵按一下 Entity Designer 設計介面的空白區域,然後指向 [加入],再按一下 [實體]。
[新增實體] 對話方塊隨即出現。
為 [實體名稱] 輸入 Instructor,然後從 [基底類型] 的下拉式清單中選取 Person。
按一下 [確定]。
在設計介面上便會建立並顯示新的實體類型。
以滑鼠右鍵按一下 Person 實體類型的 [HireDate] 屬性 (在 [純量屬性] 下方),然後選取 [剪下]。
以滑鼠右鍵按一下 Instructor 實體類型的 [純量屬性] 屬性,然後選取 [貼上]。
以滑鼠右鍵按一下 [HireDate] 屬性,然後選取 [屬性]。
[屬性] 視窗隨即出現。
在 [屬性] 視窗中將 [Nullable] 屬性設為 false。
以滑鼠右鍵按一下 OfficeAssignment 實體類型的 [Location] 屬性,然後選取 [剪下]。
以滑鼠右鍵按一下 Instructor 實體類型的 [純量屬性] 屬性,然後選取 [貼上]。
以滑鼠右鍵按一下 [Location] 屬性,然後選取 [屬性]。
在 [屬性] 視窗中將 [Nullable] 屬性設為 false。
為 OfficeAssignment 類型的 Timestamp 屬性重複步驟 10 到 13。
注意: 後續步驟需要用到 [對應詳細資料] 視窗。如果看不到這個視窗,請以滑鼠右鍵按一下設計介面,然後選取 [對應詳細資料]。 選取 Instructor 實體類型,然後按一下 [對應詳細資料] 視窗中的 [<加入資料表或檢視>]。
[<加入資料表或檢視>] 欄位會變成所選實體可對應之資料表或檢視表的下拉式清單。
從下拉式清單中選取 Person。
[對應詳細資料] 視窗會更新成預設資料行對應和用於加入條件的選項。
按一下 [<加入函式>]。
[<加入函式>] 欄位會變成可設定條件之資料行的下拉式清單。
從下拉式清單中選取 HireDate。
在 [對應詳細資料] 視窗的 [運算子] 資料行中,從下拉式清單中選取 [Is]。
在 [對應詳細資料] 視窗的 [屬性/值] 資料行中,選取 [Not Null]。
按一下 [<加入資料表或檢視>],然後從下拉式清單中選取 OfficeAssignment。
[對應詳細資料] 視窗會更新成預設資料行對應。
在對應至 InstructorID 資料行的 [屬性/值] 欄位上按一下,然後從下拉式清單中選取 PersonID。
以滑鼠右鍵按一下 OfficeAssignment 實體類型,然後選取 [刪除]。
Instructor 實體類型現已對應至 Person 和 OfficeAssignment 資料表。
建構使用者介面
接下來,您將把按鈕加入至 CourseViewer 表單,它會載入並顯示 CourseAssignmentForm 表單。然後,您將把 DataGridView 控制項加入至用於顯示 Instructor 辦公室位置的表單。最後,您將把按鈕加入至 CourseAssignmentForm,它會將更新儲存至資料庫。
若要建構使用者介面
以滑鼠右鍵按一下 [方案總管] 中的 CourseManager 專案,然後指向 [加入],再選取 [新增項目]。
[加入新項目] 對話方塊隨即出現。
選取 [Windows Form],然後將表單的名稱設為 OfficeAssignment.vb 或 OfficeAssignment.cs,再按一下 [加入]。
新的表單隨即加入至專案並在表單設計工具中開啟。這個表單的名稱已設為 OfficeAssignment,而且文字已設為 OfficeAssignment。
將 DataGridView 控制項拖曳至表單,並將它的名稱設為 officeGridView。
按一下 DataGridView 的智慧標籤,然後清除 [啟用加入] 和 [啟用刪除] 選項。
將 Button 控制項拖曳至表單,並將它的名稱屬性設為 saveChanges,以及它的文字屬性設為 Update。
按兩下 [方案總管] 中的 CourseViewer.cs 或 CourseViewer.vb。
CourseViewer 表單的設計檢視隨即出現。
將 Button 控制項從 [工具箱] 拖曳至 CourseViewer 表單。
在 [屬性] 視窗中將按鈕的名稱設為 viewOffices,然後將按鈕的文字設為 View Offices。
按兩下 viewOfficesButton。
CourseViewer 之程式碼後置的檔案隨即開啟。
將下列程式碼加入至 viewOffices_click 事件處理常式:
Dim officeForm As New OfficeAssignment() officeForm.Visible = True
OfficeAssignment officeForm = new OfficeAssignment(); officeForm.Visible = true;
現已完成此表單的使用者介面。
查詢 EDM
此應用程式會將 DataGridView 控制項繫結至 SchoolModel EDM,藉以顯示資料。DataGridView 控制項中顯示的資訊可經過編輯,而且您可以將變更儲存至資料庫。如需將物件繫結至控制項的詳細資訊,請參閱Binding Objects to Controls (Entity Framework)。
若要查詢 EDM
表單設計工具中已開啟 OfficeAssignment 表單時,按兩下表單的主體。
OfficeAssignment 表單之程式碼後置的檔案隨即開啟。
加入下列 using (C#) 或 Imports (Visual Basic) 陳述式 (Statement),以便參考您從 School 資料庫建立的模型,以及實體命名空間 (Namespace)。
Imports System.Data.Objects Imports System.Data.Objects.DataClasses
using System.Data.Objects; using System.Data.Objects.DataClasses;
把表示資料內容的屬性加入至 OfficeAssignment 類別:
' Create an ObjectContext instance based on SchoolEntity. Private schoolContext As SchoolEntities
// Create an ObjectContext instance based on SchoolEntity. private SchoolEntities schoolContext;
在 OfficeAssignment_Load 事件處理常式中加入程式碼,以便初始化物件內容,並將 DataGridView 控制項繫結至一個可傳回 Instructor 資訊的查詢。
' Initialize the ObjectContext. schoolContext = New SchoolEntities() ' Get Persons of type Instructor. Dim instructorQuery As ObjectQuery(Of Instructor) = _ schoolContext.People.OfType(Of Instructor)() ' Bind the query results to the GridView control. ' Display only location and name. officeGridView.DataSource = instructorQuery _ .Execute(MergeOption.OverwriteChanges) officeGridView.Columns("HireDate").Visible = False officeGridView.Columns("PersonID").Visible = False officeGridView.Columns("Timestamp").Visible = False officeGridView.Columns("EnrollmentDate").Visible = False officeGridView.Columns("StudentGrades").Visible = False officeGridView.Columns("Courses").Visible = False
schoolContext = new SchoolEntities(); // Get Persons of type Instructor. ObjectQuery<Instructor> instructorQuery = schoolContext .People.OfType<Instructor>(); // Bind the query results to the GridView control. // Display only location and name. officeGridView.DataSource = instructorQuery .Execute(MergeOption.OverwriteChanges); officeGridView.Columns["HireDate"].Visible = false; officeGridView.Columns["Timestamp"].Visible = false; officeGridView.Columns["PersonID"].Visible = false; officeGridView.Columns["EnrollmentDate"].Visible = false; officeGridView.Columns["StudentGrades"].Visible = false; officeGridView.Columns["Courses"].Visible = false;
回到 OfficeAssignment 表單的設計檢視,然後按兩下 saveChangesButton 控制項。
在程式碼後置的檔案中會建立 saveChanges_Click 事件處理常式。
將程式碼加入至事件處理常式,以便將 DataGridView 控制項中所做的任何變更儲存至資料庫。
' Save object changes to the database, ' display a message, and refresh the form. schoolContext.SaveChanges() MessageBox.Show("Change(s) saved to the database.") Me.Refresh()
// Save object changes to the database, // display a message, and refresh the form. schoolContext.SaveChanges(); MessageBox.Show("Change(s) saved to the database."); this.Refresh();
現已完成應用程式。按 Ctrl + F5 執行應用程式,然後按一下 [View Offices] 按鈕載入 OfficeAssignments 表單。隨即會顯示講師名稱和辦公室位置。顯示的資訊可經過編輯,而且您可以按一下 [Update] 按鈕將變更儲存至資料庫。
列出程式碼
本章節列出 OfficeAssignmentForm 表單之最終版本的程式碼後置檔案。
Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
' Create an ObjectContext instance based on SchoolEntity.
Private schoolContext As SchoolEntities
Private Sub OfficeAssignment_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
' Initialize the ObjectContext.
schoolContext = New SchoolEntities()
' Get Persons of type Instructor.
Dim instructorQuery As ObjectQuery(Of Instructor) = _
schoolContext.People.OfType(Of Instructor)()
' Bind the query results to the GridView control.
' Display only location and name.
officeGridView.DataSource = instructorQuery _
.Execute(MergeOption.OverwriteChanges)
officeGridView.Columns("HireDate").Visible = False
officeGridView.Columns("PersonID").Visible = False
officeGridView.Columns("Timestamp").Visible = False
officeGridView.Columns("EnrollmentDate").Visible = False
officeGridView.Columns("StudentGrades").Visible = False
officeGridView.Columns("Courses").Visible = False
End Sub
Private Sub saveChanges_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles saveChanges.Click
' Save object changes to the database,
' display a message, and refresh the form.
schoolContext.SaveChanges()
MessageBox.Show("Change(s) saved to the database.")
Me.Refresh()
End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
namespace CourseManager
{
public partial class OfficeAssignment : Form
{
// Create an ObjectContext instance based on SchoolEntity.
private SchoolEntities schoolContext;
public OfficeAssignment()
{
InitializeComponent();
}
private void OfficeAssignment_Load(object sender, EventArgs e)
{
schoolContext = new SchoolEntities();
// Get Persons of type Instructor.
ObjectQuery<Instructor> instructorQuery = schoolContext
.People.OfType<Instructor>();
// Bind the query results to the GridView control.
// Display only location and name.
officeGridView.DataSource = instructorQuery
.Execute(MergeOption.OverwriteChanges);
officeGridView.Columns["HireDate"].Visible = false;
officeGridView.Columns["Timestamp"].Visible = false;
officeGridView.Columns["PersonID"].Visible = false;
officeGridView.Columns["EnrollmentDate"].Visible = false;
officeGridView.Columns["StudentGrades"].Visible = false;
officeGridView.Columns["Courses"].Visible = false;
}
private void saveChanges_Click(object sender, EventArgs e)
{
// Save object changes to the database,
// display a message, and refresh the form.
schoolContext.SaveChanges();
MessageBox.Show("Change(s) saved to the database.");
this.Refresh();
}
}
}
後續步驟
您已成功將實體對應至多個資料表。如需如何以對應至多個資料表的實體來建立模型的詳細資訊,請參閱 How to: Define a Model with a Single Entity Mapped to Two Tables。如需如何建置使用 Entity Framework 之應用程式的詳細資訊,請參閱Programming Guide (Entity Framework)。