Compartir a través de


Cómo crear y ejecutar consultas de objeto con herencia de tabla por tipo (Entity Framework)

La herencia de Entity Data Model (EDM) proporciona las mismas ventajas que la herencia que se aplica en la programación orientada a objetos. Se puede operar en las instancias de los tipos en la jerarquía en conjunto o como instancias de uno de los subtipos. Todos los subtipos heredan las propiedades del tipo base, y se permite el acceso a las propiedades adicionales que se implementen en los subtipos según se necesite.

Para crear el proyecto usando la herencia de tabla por tipo

  1. Cree un proyecto de aplicación de consola denominado SchoolDataClient y agregue referencias a System.Data.Entity y System.Runtime.Serialization.

  2. Agregue una referencia a la biblioteca DLL generada con la jerarquía de herencia que se describe en el tema Cómo definir un modelo con herencia de tabla por tipo (Entity Framework).

  3. Agregue los esquemas del proyecto de herencia a la misma carpeta donde está el ejecutable de SchoolDataClient.

  4. Agregue un archivo de configuración de la aplicación al proyecto con el contenido siguiente.

<?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>

Ejemplo

En el siguiente ejemplo de código se muestran los datos de todos los departamentos del sistema.

Se mostrará un bucle foreach del tipo base Department para los tipos DeptBusiness, DeptEngineering y DeptMusic derivados del tipo Department.

El segundo bucle foreach muestra cómo obtener sólo las escuelas de ingeniería de la colección Departments.

El operador OfType permite el filtrado de los valores de un origen según el tipo.

La colección Departments contiene los departamentos de ingeniería, negocios y música, pero la especificación genérica únicamente devuelve los del tipo especificado en los corchetes angulares.

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

        }
    }
}

Vea también

Tareas

Cómo definir un modelo con herencia de tabla por tipo (Entity Framework)