Partager via


Connexion d'entité et espace de travail des métadonnées

Lors du développement d'une application qui fait appel à ADO.NET Entity Framework, vous pouvez utiliser un objet EntityConnection pour établir une connexion avec une base de données. Lorsque vous créez une instance de la classe EntityConnection dans le modèle EDM (Modèle de données d'entité), vous pouvez spécifier une chaîne de connexion dans un fichier app.config. Cette chaîne de connexion fait référence à un ensemble de métadonnées qui contient les modèles et le mappage requis, ainsi qu'à un nom de fournisseur de données spécifique au stockage et à une chaîne de connexion.

Les constructeurs pour l'objet EntityConnection incluent EntityConnection et EntityConnection. EntityConnection accepte dans un même paramètre une chaîne de connexion qui fait référence à des métadonnées et une connexion de base de données. Le constructeur EntityConnection accepte un objet MetadataWorkspace existant et une chaîne de connexion de base de données. Cela autorise un scénario clé de création d'un EntityConnection basé sur les métadonnées d'une source autre qu'un fichier situé sur un disque ou qu'une ressource incorporée dans l'assembly.

Chaque instance d'EntityConnection contient une référence à la classe MetadataWorkspace qui décrit les métadonnées relatives aux modèles conceptuel et de stockage, ainsi qu'au mappage établi entre ces deux modèles. Lorsque vous modifiez la chaîne de connexion, un espace de travail des métadonnées est créé, qui contient les métadonnées appropriées.

NoteRemarque

Toute modification d'une chaîne de connexion crée une autre instance de l'espace de travail des métadonnées, car le cache des métadonnées est indexé sur les chemins d'accès de l'artefact, ainsi que sur le nom et la chaîne de connexion du fournisseur. Si la chaîne de connexion du fournisseur est différente, les entrées du cache seront différentes.

Vous pouvez récupérer une instance de la classe MetadataWorkspace à partir d'une instance de la classe EntityConnection ou d'une version spécialisée de la classe ObjectContext. La classe ObjectContext encapsule une connexion entre ADO.NET et la base de données, connexion faisant office de passerelle pour les opérations de création, de lecture, de mise à jour et de suppression. Lorsque vous générez votre application à l'aide d'ADO.NET Entity Framework, Entity Framework génère automatiquement une classe dérivée d'ObjectContext.

L'exemple de code ci-dessous illustre deux manières de récupérer un objet MetadataWorkspace. Le premier extrait de code de l'exemple récupère explicitement une instance de la classe MetadataWorkspace à partir de l'instance de la classe EntityConnection. Le second extrait de code de l'exemple récupère implicitement une instance de la classe MetadataWorkspace à partir d'une version spécialisée de la classe ObjectContext. L'exemple de code utilise le modèle AdventureWorks décrit dans Modèle complet AdventureWorks (EDM). Pour obtenir un exemple du fichier de configuration d'application, voir Utilisation du modèle objet AdventureWorks (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

Voir aussi

Concepts

Espace de travail des métadonnées