Table-Per-Type 継承を使用してオブジェクト クエリを作成および実行する方法 (Entity Framework)
エンティティ データ モデル (EDM) の継承には、オブジェクト指向プログラミングで適用される継承と同じ利点があります。階層における複数の型のインスタンスを一緒に操作したり、1 つのサブタイプのインスタンスとして操作したりできます。すべてのサブタイプは基本データ型のプロパティを継承し、サブタイプによって実装される追加のプロパティは必要に応じてアクセスできます。
Table-Per-Type 継承を使用してプロジェクトを作成するには
SchoolDataClient という名前のコンソール アプリケーション プロジェクトを作成し、System.Data.Entity および System.Runtime.Serialization への参照を追加します。
「Table-Per-Type 継承でモデルを定義する方法 (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 型のデータが表示されます。
2 つ目の foreach
ループは、Departments コレクションからエンジニアリング スクールのみを取得する方法を示しています。
OfType 演算子は、型に基づいてソースの値をフィルタ処理することを可能にします。
Departments コレクションには、エンジニアリング、ビジネス、および音楽の部門が含まれます。ただし、一般的な指定方法では、山かっこ内に指定された種類の部門のみが返されます。
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());
}
}
}
}