次の方法で共有


Table-Per-Type 継承を使用してオブジェクト クエリを作成および実行する方法 (Entity Framework)

エンティティ データ モデル (EDM) の継承には、オブジェクト指向プログラミングで適用される継承と同じ利点があります。階層における複数の型のインスタンスを一緒に操作したり、1 つのサブタイプのインスタンスとして操作したりできます。すべてのサブタイプは基本データ型のプロパティを継承し、サブタイプによって実装される追加のプロパティは必要に応じてアクセスできます。

Table-Per-Type 継承を使用してプロジェクトを作成するには

  1. SchoolDataClient という名前のコンソール アプリケーション プロジェクトを作成し、System.Data.Entity および System.Runtime.Serialization への参照を追加します。

  2. Table-Per-Type 継承でモデルを定義する方法 (Entity Framework)」に説明されている継承階層からビルドされた DLL への参照を追加します。

  3. 継承プロジェクトのスキーマを SchoolDataClient 実行可能ファイルと同じフォルダに追加します。

  4. 次の内容のアプリケーション構成ファイルをプロジェクトに追加します。

<?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=&quot;
   Data Source=localhost;
   Initial Catalog=SchoolData;Integrated Security=True;
   MultipleActiveResultSets=True&quot;" 
   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());
            }

        }
    }
}

参照

処理手順

Table-Per-Type 継承でモデルを定義する方法 (Entity Framework)