Freigeben über


Entitätsverbindung und Metadaten-Arbeitsbereich

Bei der Entwicklung einer Anwendung mit ADO.NET Entity Framework kann mithilfe eines EntityConnection-Objekts eine Verbindung mit einer Datenbank hergestellt werden. Wenn eine neue Instanz der EntityConnection-Klasse im Entitätsdatenmodell (EDM) erstellt wird, kann in der Datei app.config eine Verbindungszeichenfolge angegeben werden. Die Verbindungszeichenfolge verweist auf einen Satz von Metadaten, die die notwendigen Modelle und das notwendige Mapping sowie einen speicherspezifischen Datenanbieternamen und eine Verbindungszeichenfolge enthalten.

Konstruktoren für die EntityConnection beinhalten EntityConnection und EntityConnection. EntityConnection verarbeitet eine Verbindungszeichenfolge, die auf Metadaten und eine Datenbankverbindung in einem einzelnen Parameter verweist. Der EntityConnection-Konstruktor verarbeitet ein vorhandenes MetadataWorkspace-Objekt und eine Datenbankverbindungszeichenfolge. Dies ermöglicht ein Schlüsselszenario, bei dem eine EntityConnection erstellt wird, die auf Metadaten basiert, die auf einer anderen Quelle als eine Datei auf einer Festplatte basieren, oder die als eingebettete Ressource in einer Assembly vorliegt.

Jede EntityConnection-Instanz enthält einen Verweis auf den MetadataWorkspace, der die Metadaten für das konzeptionelle Modell und das Speichermodell sowie das Mapping zwischen beiden enthält. Wenn Sie eine Verbindungszeichenfolge ändern, wird ein neuer Metadaten-Arbeitsbereich mit den entsprechenden Metadaten erstellt.

NoteHinweis

Bei jeder Änderung in einer Verbindungszeichenfolge wird eine unterschiedliche Instanz des Metadaten-Arbeitsbereichs erstellt, da der Metadatencache auf den Artefaktpfaden, dem Anbietername und der Verbindungszeichenfolge des Anbieters verschlüsselt ist. Wenn die Verbindungszeichenfolge des Anbieters unterschiedlich ist, sind auch die Cacheeinträge unterschiedlich.

Eine Instanz der MetadataWorkspace-Klasse kann von einer Instanz der EntityConnection-Klasse oder einer spezialisierten Version der ObjectContext-Klasse abgerufen werden. In der ObjectContext-Klasse wird die Verbindung zwischen ADO.NET und der Datenbank gekapselt. Sie dient als Gateway für Erstell-, Lese-, Aktualisierungs- und Löschvorgänge. Wenn Sie eine Anwendung mithilfe von ADO.NET Entity Framework erstellen, wird von Entity Framework automatisch eine von ObjectContext abgeleitete Klasse erstellt.

Im folgenden Codebeispiel werden zwei Möglichkeiten zum Abrufen eines MetadataWorkspace-Objekts veranschaulicht. Mit dem ersten Codebeispiel des Beispiels wird eine Instanz der MetadataWorkspace-Klasse von einer Instanz der EntityConnection-Klasse explizit abgerufen. Mit dem zweiten Codebeispiel wird eine Instanz der MetadataWorkspace-Klasse von einer spezialisierten Version der ObjectContext-Klasse implizit abgerufen. Im Codebeispiel wird das im Thema Das vollständige AdventureWorks-Modell (EDM) beschriebene "AdventureWorks"-Modell verwendet. Ein Beispiel für die Anwendungskonfigurationsdatei finden Sie unter Verwendung des AdventureWorks-Objektmodells (EDM).

using System;
using System.Data;
using System.Data.Objects;
using System.Collections.ObjectModel;
using System.Data.EntityClient;
using System.Data.Metadata.Edm;
using AdventureWorksModel;

class MetadataWorkspaceExample
{
  static void Main()
  {
    try
    {
       // Retrieve a MetadataWorkspace from the EntityConnection:
       // The input parameter for an EntityConnection is a 
       // connection string that refers to the location of the 
       // XML files containing the persistent representation of 
       // metadata.
       // Establish a connection to the underlying data provider by
       // using the connection string specified in the config file.
       using (EntityConnection connection = 
             new EntityConnection("Name=AdventureWorksEntities"))
       {
          // Get the metadata workspace from the connection.
          MetadataWorkspace workspace = 
                     connection.GetMetadataWorkspace();

          // Get a collection of the entity containers.
          ReadOnlyCollection<EntityContainer> containers = 
                   workspace.GetItems<EntityContainer>(
                                      DataSpace.CSpace);

          // Iterate through the collection to get 
          // each entity container.
          foreach (EntityContainer container in containers)
          {
              Console.WriteLine("EntityContainer Name: {0} ", 
                               container.Name);
          }
       }
     }
     catch (MetadataException exceptionMetadata)
     {
        Console.WriteLine("MetadataException: {0}", 
                         exceptionMetadata.Message);
     }
     catch (System.Data.MappingException exceptionMapping)
     {
        Console.WriteLine("MappingException: {0}",
                         exceptionMapping.Message);
     }

     try
     {
        // Retrieve a MetadataWorkspace from an ObjectContext:
        // AdventureworksContext 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;

           // Get a collection of the entity containers.
           ReadOnlyCollection<EntityContainer> containers = 
                    workspace.GetItems<EntityContainer>(
                                    DataSpace.CSpace);

           // Iterate through the collection to get 
           // each entity container.
           foreach (EntityContainer container in containers)
           {
               Console.WriteLine(
                    "EntityContainer Name: {0} ", 
                    container.Name);
            }
        }
     }
     catch (MetadataException exceptionMetadata)
     {
        Console.WriteLine("MetadataException: {0}", 
                         exceptionMetadata.Message);
     }
     catch (System.Data.MappingException exceptionMapping)
     {
        Console.WriteLine("MappingException: {0}",
                         exceptionMapping.Message);
     }
  }
}
Imports System
Imports System.Data
Imports System.Collections.ObjectModel
Imports System.Data.EntityClient
Imports System.Data.Metadata.Edm
Imports AdventureWorksModel

Class MetadataWorkspaceExample

  Public Shared Sub Main()
   Try
     ' Retrieve a MetadataWorkspace from the EntityConnection:
     ' The input parameter for an EntityConnection is a 
     ' connection string that refers to the location of the 
     ' XML files containing the persistent representation of 
     ' metadata.
     ' Establish a connection to the underlying data provider by
     ' using the connection string specified in the config file.
     Using connection As EntityConnection = _
        New EntityConnection("Name=AdventureWorksEntities")

        ' Get the metadata workspace from the connection.
        Dim workspace As MetadataWorkspace = _
           connection.GetMetadataWorkspace()

        ' Get a collection of the entity containers.
        Dim containers As ReadOnlyCollection(Of EntityContainer)
        containers = _
           workspace.GetItems(Of EntityContainer)(DataSpace.CSpace)

        ' Iterate through the collection to get 
        ' each entity container.
        Dim container As EntityContainer
        For Each container In containers
          Console.WriteLine("EntityContainer Name: {0} ", _
              container.Name)
        Next
     End Using
   Catch exceptionMetadata As MetadataException
     Console.WriteLine("MetadataException: {0}", _
        exceptionMetadata.Message)
   Catch exceptionMapping As MappingException
     Console.WriteLine("MappingException: {0}", _
          exceptionMapping.Message)
   End Try

   Try
     ' Retrieve a MetadataWorkspace from an ObjectContext:
    ' AdventureworksContext 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

      ' Get a collection of the entity containers.
      Dim containers As ReadOnlyCollection(Of EntityContainer)
      containers = _
         workspace.GetItems(Of EntityContainer)(DataSpace.CSpace)

      ' Iterate through the collection to get 
      ' each entity container.
      Dim container As EntityContainer
      For Each container In containers
        Console.WriteLine("EntityContainer Name: {0} ", container.Name)
      Next
    End Using
     Catch exceptionMetadata As MetadataException
       Console.WriteLine("MetadataException: {0}", _
           exceptionMetadata.Message)
     Catch exceptionMapping As MappingException
        Console.WriteLine("MappingException: {0}", _
           exceptionMapping.Message)
     End Try
  End Sub
End Class

Siehe auch

Konzepte

Metadaten-Arbeitsbereich