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


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

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

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

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

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

  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>

Примеры

Следующий код отображает данные для всех отделов, имеющихся в системе.

Цикл foreach базового типа Department отобразит данные для типов DeptBusiness, DeptEngineering и DeptMusic, производных от типа данных Department.

Второй цикл 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());
            }

        }
    }
}

См. также

Задачи

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