Поделиться через


Как создавать и выполнять запросы объектов с помощью наследования типа «одна таблица на иерархию» (платформа Entity Framework)

Наследование в модели Entity Data Model (EDM) дает те же преимущества, что и наследование в объектно-ориентированном программировании. С экземплярами типов в иерархии можно работать совместно или как с экземплярами одного из подтипов. Все подтипы наследуют свойства базового типа, и в случае необходимости можно обращаться к дополнительным свойствам, реализованным в подтипах.

Создание проекта с помощью наследования типа «одна таблица на иерархию»

  1. Создайте проект приложения командной строки и добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.

  2. Добавьте ссылку на библиотеку, созданную из модели наследования в разделе Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework).

  3. Добавьте схемы из раздела Как определить модель с наследованием типа «одна таблица на иерархию» (платформа 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>

Примеры

Следующий код отображает все экземпляры типов иерархии в цикле foreach, который перечисляет экземпляры типов из коллекции People в сущности SchoolDataEntities типа ObjectContext.

Тип каждого экземпляра выводится вызовом метода GetType.

Второй цикл foreach использует фильтр OfType в коллекции People для возвращения только экземпляров с типом данных 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());
            }
        }
    }
}

См. также

Задачи

Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework)

Основные понятия

Наследование (модель EDM)