Share via


Relations (métadonnées)

Dans le modèle EDM (Modèle de données d'entité), les relations définissent comment deux entités sont liées. La rubrique Relations du modèle Entity Data Model fournit des informations détaillées sur les relations dans le modèle EDM.

Les métadonnées ADO.NET fournissent un objet AssociationType pour représenter les relations entre les différents objets EntityType. Un AssociationType dérive d'un RelationshipType et représente une association EDM. De même, AssociationSet décrit les objets EntitySet qui participent à une association EDM spécifique. Pour plus d'informations sur les jeux d'entités et les ensembles d'associations, voir Jeux d'entités (EDM) et Ensemble d'associations (EDM).

L'exemple de code suivant montre comment obtenir un espace de travail des métadonnées à partir de la connexion, puis utiliser cet espace pour récupérer les informations sur les relations du modèle spécifié. Notez que l'espace de travail des métadonnées est un composant de service du runtime qui fournit une prise en charge de la récupération des métadonnées.

L'exemple de code utilise un CSpace pour spécifier le modèle. CSpace représente le nom par défaut du modèle conceptuel.

L'exemple de code comprend trois méthodes : GetAssociations, GetAssociationSets et GetOneAssociationSet.

La méthode GetAssociations obtient une collection d'associations, qu'il parcourt ensuite pour accéder à leurs membres End.

La méthode GetAssociationSets obtient une collection de conteneurs d'entités, qu'il parcourt ensuite pour obtenir chaque ensemble d'associations du conteneur spécifié. Dans le modèle EDM, un objet EntityContainer représente un regroupement logique de jeux d'entités et d'ensembles d'associations. Pour plus d'informations sur la définition des conteneurs d'entités dans le modèle EDM, voir Conteneurs d'entités (EDM).

La méthode GetOneAssociationSet obtient une collection de conteneurs d'entités, qu'il parcourt ensuite pour obtenir un seul ensemble d'associations à l'aide du nom spécifié.

L'exemple de code ci-dessous utilise le modèle AdventureWorks fourni dans la rubrique 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.EntityClient;
using System.Data.Metadata.Edm;
using System.Collections.ObjectModel;

class GetRelationshipsExample
{
  static void Main()
  {
    try
    {
      // 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"))
      {
         // Open the connection.
         connection.Open();

         // Access the metadata workspace.
         MetadataWorkspace workspace = 
             connection.GetMetadataWorkspace();

         // Get associations from the conceptual model.
         GetAssociations(workspace, DataSpace.CSpace);

         // Get association sets from the conceptual model.
         GetAssociationSets(workspace, DataSpace.CSpace);

         // Get one assoiation set by using the specified 
         // relationship name from the conceptual model.
         string relationshipName = "FK_Employee_Contact_ContactID";
         GetOneAssociationSet(
           workspace, relationshipName, DataSpace.CSpace);
       }
     }
     catch (MetadataException exceptionMetadata)
     {
        Console.WriteLine("MetadataException: {0}", 
                          exceptionMetadata.Message);
     }
     catch (System.Data.MappingException exceptionMapping)
     {
        Console.WriteLine("MappingException: {0}",
                          exceptionMapping.Message);
     }
  }

  public static void GetAssociations(
   MetadataWorkspace workspace, DataSpace model)
  {
     Console.WriteLine("***Get Associations =>");
     // Get a collection of association types.
     ReadOnlyCollection<AssociationType> associationTypes = 
          workspace.GetItems<AssociationType>(model);

     // Iterate through the collection to get each association type.
     foreach (AssociationType associationType in associationTypes)
     {
        Console.WriteLine("AssociationType Name: {0}, Namespace: {1}",
                     associationType.Name,
                     associationType.NamespaceName);

        // Iterate through the collection to get 
        // each association end member.
        foreach (AssociationEndMember end in 
                        associationType.AssociationEndMembers)
        {
           Console.WriteLine(
                   "\t End Name: {0}, Type: {1}, Multiplicity: {2}",
                   end.Name,
                   end.TypeUsage.EdmType.Name,
                   end.RelationshipMultiplicity);
        }
     }
  }

  public static void GetAssociationSets(
   MetadataWorkspace workspace, DataSpace model)
  {
     Console.WriteLine("***Get Association Sets =>");
     // Get a collection of entity containers.
     ReadOnlyCollection<EntityContainer> containers = 
           workspace.GetItems<EntityContainer>(model);

     // Iterate through the collection to get each entity container.
     foreach (EntityContainer container in containers)
     {
        // Iterate through the collection to get each entity set base.
        foreach (EntitySetBase baseSet in container.BaseEntitySets)
        {
                // EntitySetBase is a super type for 
                // AssociationSet and EntitySet. 
                // Check if the current object is an instance of the 
                // AssociationSet.
                if (baseSet is AssociationSet)
                {
                    Console.WriteLine(
                     "AssociationSet Name: {0} , " +
                     "AssociationType Name: {1} ",
                     baseSet.Name, baseSet.ElementType.FullName);

                    AssociationSet associationSet = 
                                baseSet as AssociationSet;

                    // Iterate through the collection to get 
                    // each association end.
                    foreach (AssociationSetEnd end in 
                             associationSet.AssociationSetEnds)
                    {
                        Console.WriteLine(
                          "EntitySet Name: {0} , Name: {1}, " + 
                          "AssociationEndMember: {2} ",
                          end.EntitySet, 
                          end.Name, 
                          end.CorrespondingAssociationEndMember);
                    }
                }
        }
     }
  }

  public static void GetOneAssociationSet(
      MetadataWorkspace workspace, string relationshipName, 
      DataSpace model)
  {
     Console.WriteLine("***Get One AssociationSet =>");
     // Get a collection of entity containers.
     ReadOnlyCollection<EntityContainer> containers = 
            workspace.GetItems<EntityContainer>(model);

     // Iterate through the collection to get each entity container.
     foreach (EntityContainer container in containers)
     {
        RelationshipSet relationshipSet;

        // Check if the relationship with the specified name exists 
        // or not.
        if (container.TryGetRelationshipSetByName(
                      relationshipName, true, out relationshipSet))
        {
                AssociationSet associationSet = 
                                 relationshipSet as AssociationSet;
                Console.WriteLine(
                    "AssociationSet Name: {0} , " +
                    "AssociationType Name: {1} ", 
                     associationSet.Name, 
                     associationSet.ElementType.FullName);                
         }
     }
  }
}
Imports System
Imports System.Collections.ObjectModel
Imports System.Data
Imports System.Data.EntityClient
Imports System.Data.Metadata.Edm

Class GetRelationshipsExample

  Shared Sub Main()
    Try
      ' 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")
        ' Open the conection.
         connection.Open()

        ' Access the metadata workspace.
        Dim workspace As MetadataWorkspace = _
           connection.GetMetadataWorkspace

        ' Get associations from the conceptual model.
        GetAssociations(workspace, DataSpace.CSpace)

        ' Get association sets from the conceptual model.
        GetAssociationSets(workspace, DataSpace.CSpace)

        ' Get one assoiation set by using the specified 
        ' relationship name from the conceptual model.
        Dim relationshipName As String = _
          "FK_Employee_Contact_ContactID"
        GetOneAssociationSet( _
             workspace, relationshipName, DataSpace.CSpace)
      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

  Public Shared Sub GetAssociations( _
    ByVal workspace As MetadataWorkspace, ByVal model As DataSpace)

    Console.WriteLine("***Get Associations =>")

    ' Get a collection of association types.
    Dim associationTypes As ReadOnlyCollection(Of AssociationType) = _
           workspace.GetItems(Of AssociationType)(model)

    ' Iterate through the collection to get each association type.
    Dim associationType As AssociationType
    For Each associationType In associationTypes
      Console.WriteLine("AssociationType Name: {0}, Namespace: {1}", _
          associationType.Name, associationType.NamespaceName)

      ' Iterate through the collection to get 
      ' each association end member.
      Dim endMember As AssociationEndMember
      For Each endMember In associationType.AssociationEndMembers
       Console.WriteLine(ControlChars.Tab & _
         " End Name: {0}, Type: {1}, Multiplicity: {2}", _
         endMember.Name, endMember.TypeUsage.EdmType.Name, _
         endMember.RelationshipMultiplicity)
      Next
    Next
  End Sub

  Public Shared Sub GetAssociationSets( _
    ByVal workspace As MetadataWorkspace, ByVal model As DataSpace)

    Console.WriteLine("***Get Association Sets =>")
    ' Get a collection of entity containers.
    Dim containers As ReadOnlyCollection(Of EntityContainer) = _
          workspace.GetItems(Of EntityContainer)(model)
    Dim container As EntityContainer

    ' Iterate through the collection to get each entity container.
    For Each container In containers
       Dim baseSet As EntitySetBase
       ' Iterate through the collection to get each entity set base.
       For Each baseSet In container.BaseEntitySets
         ' EntitySetBase is a super type for 
         ' AssociationSet and EntitySet. 
         ' Check if the current object is an instance of the 
         ' AssociationSet.
         If TypeOf baseSet Is AssociationSet Then
            Console.WriteLine( _
             "AssociationSet Name: {0} , AssociationType Name: {1} ", _
             baseSet.Name, baseSet.ElementType.FullName)

             Dim associationSet As AssociationSet = _
                 TryCast(baseSet, AssociationSet)
             Dim end1 As AssociationSetEnd

             ' Iterate through the collection to get 
             ' each association end.
             For Each end1 In associationSet.AssociationSetEnds
               Console.WriteLine( _
                 "EntitySet Name: {0} , Name: {1}, AssociationEndMember: {2} ", _
                  end1.EntitySet, end1.Name, _
                  end1.CorrespondingAssociationEndMember)
               Next
         End If
      Next
    Next
  End Sub

  Public Shared Sub GetOneAssociationSet( _
    ByVal workspace As MetadataWorkspace, _
    ByVal relationshipName As String, _
    ByVal model As DataSpace)

    Console.WriteLine("***Get One AssociationSet =>")
    ' Get a collection of entity containers.
    Dim containers As ReadOnlyCollection(Of EntityContainer) = _
      workspace.GetItems(Of EntityContainer)(model)
    Dim container As EntityContainer

    ' Iterate through the collection to get each entity container.
    For Each container In containers
       Dim relationshipSet As RelationshipSet
       relationshipSet = Nothing
       ' Check if the relationship with the specified name exists 
       ' or not.
       If container.TryGetRelationshipSetByName( _
          relationshipName, True, relationshipSet) Then
          Dim associationSet As AssociationSet = _
            TryCast(relationshipSet, AssociationSet)
          Console.WriteLine( _
            "AssociationSet Name: {0} , AssociationType Name: {1} ", _
             associationSet.Name, associationSet.ElementType.FullName)
        End If
      Next
  End Sub
End Class

Voir aussi

Concepts

Hiérarchie des types de métadonnées