Compartir a través de


Colecciones de elementos (metadatos)

En el Entity Data Model (EDM), las colecciones de elementos son responsables de cargar los metadatos de los recursos permanentes, como los archivos XML o los ensamblados de Common Language Runtime (CLR), y se encuentran en una instancia de la clase MetadataWorkspace.

ADO.NET proporciona una clase ItemCollection como API básica para cargar y contener los metadatos en memoria. La clase ItemCollection tiene varias clases derivadas, como ObjectItemCollection, EdmItemCollection, StoreItemCollection y StorageMappingItemCollection. Cada una de estas clases de colecciones está especializada en un tipo diferente de metadatos. En las secciones siguientes se explica cómo interactúan estas clases de colecciones con los distintos tipos de metadatos.

ObjectItemCollection

La clase ObjectItemCollection es responsable de cargar los metadatos relacionados con el modelo de objetos. El modelo de objetos representa las clases CLR que se pueden usar como una realización de programación del modelo conceptual.

La clase ObjectItemCollection busca los ensamblados a los que se hace referencia y que se representan con el EdmSchemaAttribute, y después carga las clases en los ensamblados que se corresponden con las clases permanentes de ADO.NET Entity Framework. En concreto, se cargan las clases que derivan de System.Data.Objects.DataClasses.

Cuando las clases no existen en las ensamblados a los que se hace referencia, la infraestructura de metadatos de ADO.NET carga los metadatos CLR en Entity Framework de forma implícita. Por ejemplo, cuando se crea una instancia nueva de la clase ObjectQuery<T> para generar una consulta, la infraestructura de metadatos de ADO.NET comprueba si el parámetro de tipo <T> ya está en los metadatos o no. Si el parámetro de tipo <T> no está en los metadatos, la infraestructura de metadatos de ADO.NET carga los metadatos a partir del ensamblado que incluya el parámetro de tipo <T> de forma implícita.

También se pueden cargar los metadatos a partir de un ensamblado concreto al que no se haga referencia explícitamente en la aplicación actual. En este caso, puede llamar al método LoadFromAssembly que se define en la clase MetadataWorkspace o al método LoadFromAssembly que se define en la clase ObjectItemCollection.

El método LoadFromAssembly tiene acceso internamente a su ObjectItemCollection registrada y llama al método LoadFromAssembly que se define en la clase ObjectItemCollection.

En el ejemplo de código siguiente se muestra cómo cargar metadatos a partir de un ensamblado específico. El ejemplo de código usa el modelo de AdventureWorks para abrir una conexión con la base de datos subyacente. Después, carga el modelo de Human Resources Skills de forma explícita. Para obtener más información acerca de los modelos de AdventureWorks y Human Resources Skills, vea Modelo completo (EDM) de AdventureWorks y WinApp Human Resources Skills (aplicación de ejemplo de EDM).

Imports System
Imports System.Data
Imports System.Reflection
Imports System.Collections.ObjectModel
Imports System.Data.Metadata.Edm
Imports AdventureWorksModel

Class LoadAssemblyExample

  ' This sample illustrates loading metadata from a specific assembly.
  Public Shared Sub Main()
    Try
      ' Retrieve a MetadataWorkspace from an ObjectContext:
      ' AdventureWorksEntities represents the ADO.NET ObjectContext 
      ' that acts as a factory for queries; 
      ' tracks object state; and is used to initiate 
      ' updates against the database.
      Using db As AdventureWorksEntities = New AdventureWorksEntities

         ' Dereference the workspace from the AdventureWorksEntities 
         ' class 
         ' (an ObjectContext specialization).
         Dim workspace As MetadataWorkspace = db.MetadataWorkspace

         ' Load metadata from the HRSkills assembly.
         workspace.LoadFromAssembly(Assembly.Load("HRSkills"))

         ' Get a collection of the EdmTypes from the object model.
         Dim types As ReadOnlyCollection(Of EdmType) = _
            workspace.GetItems(Of EdmType)(DataSpace.OSpace)

         ' Iterate through the collection to get each EdmType.
         Dim item As EdmType
         For Each item In types
             Console.WriteLine("Type: {0}, Type in Model: {1} ", _
                     item.GetType.FullName, item.FullName)
         Next
      End Using
    Catch exceptionMetadata As MetadataException
       Console.WriteLine("MetadataException: {0}", _
          exceptionMetadata.Message)
    End Try
  End Sub
End Class
using System;
using System.Data;
using System.Reflection;
using System.Collections.ObjectModel;
using System.Data.Metadata.Edm;
using AdventureWorksModel;

class LoadAssemblyExample
{
  // This sample illustrates loading metadata from a specific assembly.
  static void Main()
  {
     try
     {
        // Retrieve a MetadataWorkspace from an ObjectContext:
        // AdventureWorksEntities represents the ADO.NET ObjectContext 
        // that acts as a factory for queries; 
        // tracks object state; and is used to initiate 
        // updates against the database.
       using (
           AdventureWorksEntities db = new AdventureWorksEntities ())
        {
           // Dereference the workspace from the AdventureWorksEntities 
           // class (an ObjectContext specialization).
           MetadataWorkspace workspace = db.MetadataWorkspace;

           // Load metadata from the HRSkills assembly.
           workspace.LoadFromAssembly(
                   Assembly.Load(@"HRSkills"));

           // Get a collection of the EdmTypes from the object model.
           ReadOnlyCollection<EdmType> types =
               workspace.GetItems<EdmType>(DataSpace.OSpace);

           // Iterate through the collection to get each EdmType.
           foreach (EdmType item in types)
           {
               Console.WriteLine("Type: {0}, Type in Model: {1} ",
                      item.GetType().FullName, item.FullName);
           }
       }
     }
     catch (MetadataException exceptionMetadata)
     {
        Console.WriteLine("MetadataException: {0}",
                         exceptionMetadata.Message);
     }
  }
}

EdmItemCollection

Una clase EdmItemCollection es responsable de cargar los metadatos relacionados con el modelo conceptual. La clase EdmItemCollection carga sus metadatos a partir de un archivo del lenguaje de definición de esquemas conceptuales (CSDL, Conceptual Schema Definition Language) que es una representación XML del modelo conceptual.

EdmItemCollection y StoreItemCollection se pueden crear a partir de orígenes persistentes como los archivos, recursos en ensamblados o de XmlReader.

StoreItemCollection

Una clase StoreItemCollection es responsable de cargar los metadatos relacionados con el modelo de almacenamiento (base de datos). La clase StoreItemCollection carga sus metadatos a partir de un archivo del lenguaje de definición de esquemas de almacenamiento (SSDL, Store Schema Definition Language) que es una representación XML del modelo de almacenamiento.

EdmItemCollection y StoreItemCollection se pueden crear a partir de orígenes persistentes como los archivos, recursos en ensamblados o de XmlReader.

StorageMappingItemCollection

Una clase StorageMappingItemCollection es responsable de cargar los metadatos que representan la asignación entre el modelo conceptual y el modelo de almacenamiento (base de datos). La clase StorageMappingItemCollection carga sus metadatos a partir de un archivo del lenguaje de especificación de asignaciones (MSL, Mapping Specification Language) que es una representación XML de la asignación entre el modelo conceptual y el modelo de almacenamiento.

Vea también

Conceptos

Área de trabajo de metadatos