次の方法で共有


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

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

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

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

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

  3. トピック「Table-Per-Hierarchy 継承でモデルを定義する方法 (Entity Framework)」のスキーマを実行可能ファイルと同じフォルダに追加します。

  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>

次のコードを実行すると、SchoolDataEntitiesObjectContextPeople コレクションから型のインスタンスを列挙する foreach ループ内で階層の型のすべてのインスタンスが表示されます。

各インスタンスの型は、GetType メソッドの呼び出しによって表示されます。

2 つ目の foreach ループでは、People コレクションに対して OfType フィルタを使用して、Instructor 型のインスタンスのみを返します。

HireDate プロパティを含むのは Instructor 型のみです。このコードを実行すると、HireDate と一緒に、クエリから返されたインストラクタの姓名が表示されます。

Option Strict On
Option Explicit On
Imports System
Imports System.Collections.Generic
Imports System.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 person reference.
                    dept.AdministratorReference.Load()
                    If dept.Administrator IsNot Nothing Then
                        Console.WriteLine("Administrator: {0} {1}", _
                            dept.Administrator.FirstName, _
                            dept.Administrator.LastName)
                    End If

                    For Each student As Student In objectContext.People.OfType(Of Student)()
                        Console.WriteLine("Student: {0} {1}", student.FirstName, _
                            student.LastName)
                    Next

                    For Each person As Person In objectContext.People
                        Console.WriteLine("{0} Name: {1}", _
                            person.GetType().Name, person.LastName)
                    Next

                    For Each instructor In objectContext.People. _
                            OfType(Of Instructor)()
                        Console.WriteLine("Instructor: {0} {1} Hire Date: {2}", _
                            instructor.FirstName, _
                            instructor.LastName, _
                            instructor.HireDate)
                    Next

                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;
using System.Data.Objects;

namespace SchoolDataClient
{
    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 person reference.
                        dept.AdministratorReference.Load();
                        if (null != dept.Administrator)
                            Console.WriteLine("Administrator: {0} {1}",
                                         dept.Administrator.FirstName,
                                         dept.Administrator.LastName);
                    }

                    foreach (Student student in
                        objectContext.People.OfType<Student>())
                    {
                        Console.WriteLine("Student: {0} {1}", student.FirstName,
                            student.LastName);

                    }

                    
                    foreach (Person person in objectContext.People)
                        Console.WriteLine("{0} Name: {1}",
                            person.GetType().Name,
                            person.LastName);

                    foreach (Instructor instructor in
                        objectContext.People.OfType<Instructor>())
                        Console.WriteLine("Instructor: {0} {1} Hire Date: {2}",
                            instructor.FirstName,
                            instructor.LastName,
                            instructor.HireDate);

                    objectContext.Connection.Close();
                }
            }

            catch (System.Data.MappingException e)
            {
                Console.WriteLine(e.ToString());
            }
            catch (System.Data.UpdateException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

参照

処理手順

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

概念

継承 (EDM)