Поделиться через


Связи (метаданные)

Связи в модели Entity Data Model EDM определяют связь двух сущностей. В разделе Связи в модели EDM представлены подробные сведения о связях в модели EDM.

В метаданных ADO.NET для представления связей между сущностями EntityType предоставляется тип AssociationType. Тип AssociationType является производным от типа RelationshipType и представляет ассоциацию модели EDM. Аналогично тип AssociationSet описывает сущности EntitySet, участвующие в конкретной ассоциации модели EDM. Дополнительные сведения о наборах сущностей и ассоциаций см. в разделах Наборы сущностей (модель EDM) и Наборы ассоциаций (модель EDM).

В следующем образце кода показано, как получить рабочее пространство метаданных из соединения и использовать его для получения сведений о связях в заданной модели. Обратите внимание, что рабочая область метаданных — это служебный компонент времени выполнения, который обеспечивает поддержку извлечения метаданных.

В образце кода для указания модели используется элемент CSpace. Элемент CSpace представляет собой имя по умолчанию для концептуальной модели.

Этот образец кода содержит три метода: GetAssociations, GetAssociationSets и GetOneAssociationSet.

Метод GetAssociations получает коллекцию ассоциаций и перебирает ее, чтобы получить доступ к элементам ассоциаций End.

Метод GetAssociationSets получает коллекцию контейнеров сущностей и перебирает ее, чтобы получить все наборы ассоциаций в заданном контейнере. В модели EDM объект EntityContainer представляет логическое группирование наборов сущностей и наборов ассоциаций. Дополнительные сведения об определении контейнеров сущностей в модели EDM см. в разделе Контейнеры сущностей (модель EDM).

Метод GetOneAssociationSet получает коллекцию контейнеров сущностей и перебирает ее, чтобы получить только один набор ассоциаций по заданному имени.

В следующем образце кода используется модель AdventureWorks, приведенная в разделе Полная модель AdventureWorks (модель EDM). Пример файла конфигурации приложения см. в разделе Использование модели объектов 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

См. также

Основные понятия

Иерархия типов метаданных