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