Как создавать и выполнять запросы объектов с помощью наследования типа «одна таблица на иерархию» (платформа Entity Framework)
Наследование в модели Entity Data Model (EDM) дает те же преимущества, что и наследование в объектно-ориентированном программировании. С экземплярами типов в иерархии можно работать совместно или как с экземплярами одного из подтипов. Все подтипы наследуют свойства базового типа, и в случае необходимости можно обращаться к дополнительным свойствам, реализованным в подтипах.
Создание проекта с помощью наследования типа «одна таблица на иерархию»
Создайте проект приложения командной строки и добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.
Добавьте ссылку на библиотеку, созданную из модели наследования в разделе Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework).
Добавьте схемы из раздела Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework) в папку, в которой расположен исполняемый файл.
Добавьте файл конфигурации приложения с содержимым из следующего примера.
<?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>
Примеры
Следующий код отображает все экземпляры типов иерархии в цикле 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)