如何:使用每种类型一个表继承创建和执行对象查询(实体框架)

实体数据模型 (EDM) 中的继承提供了应用于面向对象编程的继承的一些优势。层次结构中类型的实例可以在其中一个子类型的实例上一起运行,或者作为其中一个子类型的实例运行。所有子类型都继承基类型的属性,并且可以根据需要访问由子类型实现的其他属性。

使用每种类型一个表继承创建项目

  1. 创建一个名为 SchoolDataClient 的控制台应用程序项目并添加对 System.Data.EntitySystem.Runtime.Serialization 的引用。

  2. 对于从在如何:通过每种类型一个表继承以定义模型(实体框架) 中介绍的继承层次结构中生成的 dll,添加针对它的引用。

  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>

示例

以下代码显示系统中所有系的数据。

针对基类型 Departmentforeach 循环将显示从 Department 类型派生的 DeptBusinessDeptEngineeringDeptMusic 类型的数据。

第二个 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());
            }

        }
    }
}

另请参见

任务

如何:通过每种类型一个表继承以定义模型(实体框架)