HOW TO:使用每個類型的資料表繼承來建立和執行物件查詢 (Entity Framework)
實體資料模型 (EDM) 中的繼承提供了物件導向程式設計中所適用的相同繼承好處。此階層中的型別執行個體可以一起運作,或是當做其中一個子型別的執行個體。所有子型別都會繼承基底類型的屬性,而且可以視需要存取子型別所實作的其他屬性。
若要使用每個類型的資料表繼承來建立專案
建立名為 SchoolDataClient 的主控台應用程式專案,並加入 System.Data.Entity 和 System.Runtime.Serialization 的參考。
加入從 HOW TO:使用每個類型的資料表繼承來定義模型 (Entity Framework) 所述之繼承階層建置而來之 dll 的參考。
將繼承專案中的結構描述加入至與 SchoolDataClient 可執行檔相同的資料夾。
將具有底下內容的應用程式組態檔加入專案中。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings><add name="SchoolDataLibContainer"
connectionString=
"metadata=res://*/SchoolDataLib.csdl|
res://*/SchoolDataLib.ssdl|
res://*/SchoolDataLib.msl;provider=System.Data.SqlClient;
provider connection string="
Data Source=localhost;
Initial Catalog=SchoolData;Integrated Security=True;
MultipleActiveResultSets=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
範例
下列程式碼會顯示系統中所有部門的資料。
基底類型 Department 上的 foreach
迴圈將會顯示衍生自 Department 型別之 DeptBusiness、DeptEngineering 和 DeptMusic 型別的資料。
第二個 foreach
迴圈會顯示如何從 Departments 集合中只取得 engineering 學校。
OfType 運算子允許從根據型別的來源篩選值。
Departments 集合包含了 engineering、business 和 music 等科系,但是一般規格只會傳回單一括號內所指定之型別的部門。
Option Strict On
Option Explicit On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml
Imports System.Xml.Linq
Imports System.Text
Imports SchoolDataLib
Module Module1
Sub Main()
Try
Using objectContext As SchoolDataLibContainer = New SchoolDataLibContainer()
' Display departments and administrators.
For Each dept As Department In objectContext.Departments
Console.WriteLine("School: {0} Budget: {1}", _
dept.Name, dept.Budget)
' Load associated contact reference if any.
dept.AdministratorReference.Load()
If dept.Administrator IsNot Nothing Then
Console.WriteLine("Administrator: {0} {1}", _
dept.Administrator.FirstName, _
dept.Administrator.LastName)
End If
Next
For Each eDept As DeptEngineering In _
objectContext.Departments.OfType(Of DeptEngineering)()
Console.WriteLine("{0} LabBudget: {1} FiberOp Budget: {2}", _
eDept.Name, eDept.LabBudget.ToString(), _
eDept.FiberOpticsBudget.ToString())
Next
End Using
Catch ex As System.Data.MappingException
Console.WriteLine(ex.ToString())
Catch ex As System.Data.UpdateException
Console.WriteLine(ex.ToString())
End Try
End Sub
End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SchoolDataLib;
namespace SchoolDataTPTClient
{
class Program
{
static void Main(string[] args)
{
try
{
using (SchoolDataLibContainer objectContext =
new SchoolDataLibContainer())
{
// Display departments and administrators.
foreach (Department dept in objectContext.Departments)
{
Console.WriteLine("School: {0} Budget: {1}",
dept.Name,
dept.Budget);
// Load associated contact reference if any.
dept.AdministratorReference.Load();
if (null != dept.Administrator)
Console.WriteLine("Administrator: {0} {1}",
dept.Administrator.FirstName,
dept.Administrator.LastName);
}
foreach (DeptEngineering eDept in
objectContext.Departments.OfType<DeptEngineering>())
Console.WriteLine("{0} LabBudget: {1} FiberOp Budget: {2}",
eDept.Name, eDept.LabBudget.ToString(),
eDept.FiberOpticsBudget.ToString());
}
}
catch (System.Data.MappingException e)
{
Console.WriteLine(e.ToString());
}
catch (System.Data.UpdateException e)
{
Console.WriteLine(e.ToString());
}
}
}
}