Freigeben über


Elementauflistungen (Metadaten)

Im Entitätsdatenmodell (EDM) werden mithilfe von Elementauflistungen Metadaten aus dauerhaften Ressourcen geladen, wie beispielsweise XML-Dateien oder CLR (Common Language Runtime)-Assemblys. Elementauflistungen befinden sich in einer Instanz der MetadataWorkspace-Klasse.

ADO.NET stellt eine ItemCollection-Klasse als Haupt-API zum Laden und Speichern der Metadaten bereit. Die ItemCollection enthält mehrere abgeleitete Klassen, wie beispielsweise ObjectItemCollection, EdmItemCollection, StoreItemCollection und StorageMappingItemCollection. Jede dieser Auflistungsklassen enthält Metadaten eines bestimmten Typs. In den folgenden Abschnitten wird erläutert, wie diese Auflistungsklassen mit den unterschiedlichen Metadatentypen interagieren.

ObjectItemCollection

Mit der ObjectItemCollection-Klasse werden die Metadaten für das Objektmodell geladen. Das Objektmodell stellt die CLR-Klassen dar, die als programmgesteuerte Realisierung des konzeptionellen Modells verwendet werden können.

Die ObjectItemCollection sucht nach Assemblys, auf die verwiesen wird und die mit dem EdmSchemaAttribute versehen sind. Anschließend werden die Klassen in die Assemblys geladen, die den dauerhaften Klassen für ADO.NET Entity Framework entsprechen. Es werden insbesondere die Klassen geladen, die von System.Data.Objects.DataClasses abgeleitet werden.

Wenn die Klassen in den Assemblys, auf die verwiesen wird, nicht vorhanden sind, werden die CLR-Metadaten in Entity Framework von der ADO.NET-Metadateninfrastruktur implizit geladen. Wenn Sie beispielsweise eine neue Instanz der ObjectQuery<T>-Klasse erstellen, um eine Abfrage zu konstruieren, überprüft die ADO.NET-Metadateninfrastruktur, ob sich der Typparameter <T> bereits in den Metadaten befindet. Wenn sich der Typparameter <T> nicht in den Metadaten befindet, lädt die ADO.NET-Metadateninfrastruktur die Metadaten von der Assembly, die den Typparameter <T> implizit enthält.

Sie können außerdem die Metadaten von einer bestimmten Assembly laden, auf die in Ihrer aktuellen Anwendung nicht explizit verwiesen wird. In diesem Fall können Sie entweder die LoadFromAssembly-Methode aufrufen, die in der MetadataWorkspace-Klasse definiert wird, oder die LoadFromAssembly-Methode, die in der ObjectItemCollection-Klasse definiert wird.

Die LoadFromAssembly-Methode greift intern auf ihre registrierte ObjectItemCollection zu und ruft die LoadFromAssembly-Methode auf, die für die ObjectItemCollection-Klasse definiert ist.

Im folgenden Codebeispiel ist dargestellt, wie Metadaten von einer bestimmten Assembly geladen werden. Das Codebeispiel verwendet das AdventureWorks-Modell, um eine Verbindung mit der zugrunde liegenden Datenbank herzustellen. Anschließend wird das "Human Resources Skills"-Modell explizit geladen. Weitere Informationen über die Modelle "AdventureWorks" und "Human Resources Skills" finden Sie unter Das vollständige AdventureWorks-Modell (EDM) und Human Resources Skills-WinApp (EDM-Beispielanwendung).

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

Mit der EdmItemCollection-Klasse werden die Metadaten über das konzeptionelle Modell geladen. Die EdmItemCollection-Klasse lädt die Metadaten aus einer Conceptual Schema Definition Language (CSDL)-Datei, bei der es sich um eine XML-Darstellung des konzeptionellen Modells handelt.

EdmItemCollection und StoreItemCollection können aus beständigen Quellen erstellt werden, wie beispielsweise Dateien, Ressourcen in Assemblys oder XmlReader.

StoreItemCollection

Mit der StoreItemCollection-Klasse werden die Metadaten über das Speicher- bzw. Datenbankmodell geladen. Die StoreItemCollection-Klasse lädt die Metadaten aus einer Store Schema Definition Language (SSDL)-Datei, bei der es sich um eine XML-Darstellung des Speichermodells handelt.

EdmItemCollection und StoreItemCollection können aus beständigen Quellen erstellt werden, wie beispielsweise Dateien, Ressourcen in Assemblys oder XmlReader.

StorageMappingItemCollection

Mit der StorageMappingItemCollection-Klasse werden die Metadaten geladen, die das Mapping zwischen dem konzeptionellen Modell und dem Speicher- bzw. Datenbankmodell darstellen. Die StorageMappingItemCollection-Klasse lädt die Metadaten von einer MSL-Datei, bei der es sich um eine XML-Darstellung des Mappings zwischen dem konzeptionellen Modell und dem Speichermodell handelt.

Siehe auch

Konzepte

Metadaten-Arbeitsbereich