实体数据模型 (EDM) 中的关系定义两个实体相关的方式。实体数据模型关系主题详细介绍有关 EDM 中的关系的信息。
ADO.NET 元数据提供 AssociationType 来表示各个 EntityType 之间的关系。AssociationType 派生自 RelationshipType 并表示一种 EDM 关联。同样,AssociationSet 描述参与特定 EDM 关联的 EntitySet。有关实体集和关联集的更多信息,请参见实体集 (EDM) 和关联集 (EDM)。
以下代码示例演示如何通过连接获得元数据工作区,然后使用该元数据工作区以在指定模型中检索有关关系的信息。请注意,元数据工作区是一个为检索元数据提供支持的运行时服务组件。
该代码示例使用 CSpace 指定模型。CSpace 表示概念性模型的默认名称。
此代码示例包含三个方法:GetAssociations、GetAssociationSets 和 GetOneAssociationSet。
GetAssociations 方法获取关联集合,然后循环访问此集合以访问其关联 End 成员。
GetAssociationSets 方法获得实体容器的集合,然后循环访问此集合以获取指定容器中的每个关联集。在 EDM 中,EntityContainer 表示实体集和关联集的逻辑分组。有关如何在 EDM 中定义实体容器的更多信息,请参见实体容器 (EDM)。
GetOneAssociationSet 方法获得实体容器的集合,然后循环访问此集合以仅获取使用指定名称的一个关联集。
以下代码示例使用在 AdventureWorks 完整模型 (EDM) 中提供的 Adventureworks 模型。有关应用程序配置文件的示例,请参见使用 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