Freigeben über


Strukturtypen (Metadaten)

Strukturtypen sind in Entitätsdatenmodell EDM-Typen, die Member enthalten. Member definieren den Inhalt der Typen, die von der StructuralType-Klasse abgeleitet werden. Die StructuralType-Klasse enthält unterschiedliche abgeleitete Typen, wie beispielsweise EntityType, RelationshipType und ComplexType.

EntityType stellt ein Konzept auf der obersten Ebene dar, beispielsweise einen Kunden oder eine Bestellung im EDM. RelationshipType ist ein Basistyp für AssociationType, der eine Zuordnung im EDM darstellt. Weitere Informationen über die Entitäten und Zuordnungen im EDM finden Sie unter Entitätstyp (EDM) und Zuordnung (EDM).

ComplexType stellt einen Typ dar, der ähnlich wie ein Entitätstyp eine Reihe von Eigenschaften, jedoch keine Schlüsseleigenschaft enthält. Weitere Information über die komplexen Typen im EDM finden Sie unter Komplexer Typ (EDM).

In den EDM-Schemas enthalten EntityType, RelationshipType und ComplexType untergeordnete Elemente oder Member. Member eines Entitätstyps sind beispielsweise dessen Eigenschaften sowie die Endpunkte von Beziehungen. Jeder Member verfügt über einen deklarierenden Typ und kann über die NULL-Zulässigkeitseinschränkung oder eine Standardwertzuweisung verfügen.

In den folgenden Abschnitten finden Sie ausführliche Informationen über Member.

Member

Member definieren im EDM den Inhalt der Typen, die von der StructuralType-Klasse abgeleitet werden. Die folgende XML-Darstellung ist beispielsweise der im Thema Vollständiges konzeptionelles Schema für AdventureWorks (EDM) angegebenen "AdventureWorks"-CSDL-Datei entnommen. Diese XML-Darstellung definiert den Department-EntityType. Die Member der Department-Entität sind DepartmentID, Name, GroupName, ModifiedDate und EmployeeDepartmentHistory.

<EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="Int16" Nullable="false" />
    <Property Name="Name" Type="String" Nullable="false" />
    <Property Name="GroupName" Type="String" Nullable="false" />
    <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
    <NavigationProperty Name="EmployeeDepartmentHistory" Relationship="Adventureworks.FK_EmployeeDepartmentHistory_Department_DepartmentID" FromRole="Department" ToRole="EmployeeDepartmentHistory" />
</EntityType>

Sie können eine Liste der Member eines Strukturtyps mithilfe der System.Data.Metadata.Edm.StructuralType.Members-Eigenschaft abrufen, die von StructuralType bereitgestellt wird. Die Members-Eigenschaft gibt die ReadOnlyMetadataCollection zurück, in der die EdmMember-Objekte enthalten sind.

Die von StructuralType abgeleiteten Typen speichern ihre Member in der von StructuralType geerbten Members-Eigenschaft.

Zusätzlich zu der von StructuralType geerbten Members-Eigenschaft werden von jedem abgeleiteten Typ weitere Eigenschaften bereitgestellt, um eine Liste der speziellen Member abzurufen, die für diesen Typ deklariert werden können. System.Data.Metadata.Edm.EntityType.Properties gibt beispielsweise eine Auflistung zurück, in der die EdmProperty-Objekte enthalten sind.

Dementsprechend enthält RelationshipType eine System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers-Eigenschaft, von der eine Auflistung der RelationshipEndMember-Objekte zurückgegeben wird. Beachten Sie, dass sowohl EdmProperty als auch RelationshipEndMember von EdmMember abgeleitet werden.

Die folgende Liste enthält eine Reihe von Eigenschaften, die zum Abrufen der Member von Strukturtypen verwendet werden können:

  • System.Data.Metadata.Edm.EntityType.Members: Ruft eine Liste aller Member des EntityType-Objekts ab. Die Member von EntityType können Eigenschaften, Navigationseigenschaften und Schlüsselmember des EntityType-Objekts enthalten. Die System.Data.Metadata.Edm.EntityType.Members-Eigenschaft wird von der StructuralType-Klasse geerbt. Weitere Informationen über das Festlegen der Member von EntityType in einem konzeptionellen Schema finden Sie unter EntityType-Element (CSDL).

  • System.Data.Metadata.Edm.EntityType.Properties: Ruft eine Liste der Eigenschaften des EntityType-Objekts ab. Weitere Informationen über das Festlegen der Eigenschaften von EntityType in einem konzeptionellen Schema finden Sie unter Entitätstyp (EDM) und EntityType-Element (CSDL).

  • System.Data.Metadata.Edm.EntityType.NavigationProperties: Ruft eine Liste der Navigationseigenschaften des EntityType-Objekts ab. Weitere Informationen über das Festlegen der Eigenschaften von EntityType in einem konzeptionellen Schema finden Sie unter Entitätstyp (EDM) und EntityType-Element (CSDL).

  • System.Data.Metadata.Edm.EntityType.KeyMembers: Ruft eine Liste der Schlüsselmember des EntityType-Objekts ab. Diese Eigenschaft wird von der EntityTypeBase-Klasse geerbt.

  • System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers: Ruft eine Liste der End-Member des RelationshipType-Objekts ab.

  • System.Data.Metadata.Edm.AssociationType.AssociationEndMembers: Ruft eine Liste der End-Member des AssociationType-Objekts ab. Weitere Informationen über das Festlegen der End-Member von AssociationType in einem konzeptionellen Schema finden Sie unter Association-Element (CSDL).

  • System.Data.Metadata.Edm.ComplexType.Properties: Ruft eine Liste der Eigenschaften des ComplexType-Objekts ab. Weitere Informationen über das Festlegen der Eigenschaften von ComplexType in einem konzeptionellen Schema finden Sie unter Komplexer Typ (EDM) und Gewusst wie: Definieren eines Modells mit komplexen Typen (Entity Framework). Im Codebeispiel in der ComplexType-Klasse wird gezeigt, wie die Eigenschaften der komplexen Typen im angegebenen Modell abgerufen werden.

Im folgenden Codebeispiel wird von der Verbindung ein Metadaten-Arbeitsbereich abgerufen und verwendet, um Informationen über die Member der Entität sowie Beziehungstypen im angegebenen Modell abzurufen. Beachten Sie, dass es sich bei dem Metadaten-Arbeitsbereich um eine Laufzeitdienstkomponente handelt, die das Abrufen von Metadaten unterstützt.

Im Codebeispiel wird CSpace verwendet, um das Modell anzugeben. CSpace stellt den Standardnamen für das konzeptionelle Modell dar. Im Codebeispiel wird das im Thema Das vollständige AdventureWorks-Modell (EDM) bereitgestellte AdventureWorks-Modell verwendet. Ein Beispiel für eine Anwendungskonfigurationsdatei finden Sie unter Verwendung des AdventureWorks-Objektmodells (EDM).

using System;
using System.Data;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Data.EntityClient;
using System.Data.Metadata.Edm;

class GetMembersExample
{
  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 members of entity types and relationship types.
         GetMembers(workspace, 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 GetMembers(
    MetadataWorkspace workspace, DataSpace model)
  {
    // Get a collection of entity types.
    ReadOnlyCollection<EntityType> entityTypes = 
            workspace.GetItems<EntityType>(model);

    // Iterate through the collection to get each entity type.
    foreach (EntityType entityType in entityTypes)
    {
       Console.WriteLine(
          "\n\n***EntityType Name: {0}, Namespace: {1}, RefType: {2}",
          entityType.Name,
          entityType.NamespaceName,
          entityType.GetReferenceType());
          
       Console.WriteLine(
          "\nGet all members of the current EntityType object ==>");
          // Iterate through the collection to get all members of the 
       // current EntityType object.
       foreach (EdmMember member in entityType.Members)
       {
          Console.Write("   Member Name: {0} ", member.Name);
       }

       Console.WriteLine(
           "\nGet only the properties of the current "+
           "EntityType object ==>");
       // Iterate through the collection to get each property of the 
       // current EntityType object.
       foreach (EdmProperty property in entityType.Properties)
       {
          Console.Write("   Property Name: {0} ", property.Name);
          Console.WriteLine(
                "   Property declaring Type: {0}, edmtype: {1}," + 
                " default: {2}, nullable: {3} ", 
                property.DeclaringType, property.TypeUsage.EdmType, 
               property.Default, property.Nullable);
       }

       Console.WriteLine("\nGet only the navigation properties of " +
             "the current EntityType object ==>");
       // Iterate through the collection to get each navigation 
       // property of the current EntityType object.
       foreach (NavigationProperty property in 
                      entityType.NavigationProperties)
       {
          Console.Write(
                "Name: {0}, RelationshipTypeName: {1}, " + 
                "ToEndMemberName: {2} ",
                property.Name, property.RelationshipType.Name, 
                property.ToEndMember.Name);
       }

       Console.WriteLine("\nGet only the key members of the " + 
            "current EntityType object ==>");
         // Iterate through the collection to get each key members of 
         // the current EntityType object.
         ReadOnlyMetadataCollection<EdmMember> collectionKeyMembers = 
             entityType.KeyMembers;
         if (collectionKeyMembers.Count != 0)
         {
            Console.Write("   Key: {0} ", 
                    GetKeys(collectionKeyMembers));
          }
     }

     // Get a collection of relationship types.
     ReadOnlyCollection<RelationshipType> relationshipTypes = 
        workspace.GetItems<RelationshipType>(model);

     // Iterate through the collection to get each relationship type.
     foreach (RelationshipType relationType in relationshipTypes)
     {
        Console.WriteLine(
               "\n\nRelationshipType Name: {0}, Namespace: {1}",
               relationType.Name,
               relationType.NamespaceName);
        Console.WriteLine(
             "\nGet all members of the current "+
             "RelationshipType object ==>");
           // Iterate through the collection to get all members of the
           // current RelationshipType object.
        foreach (EdmMember member in relationType.Members)
        {
            Console.Write("   Member Name: {0} ", member.Name);
        }

        Console.WriteLine(
            "\nGet only the end members of the current " +
            "RelationshipType object ==>");
         // Iterate through the collection to get only the end 
         // members of
         // the current RelationshipType object.
         foreach (RelationshipEndMember endMember in 
             relationType.RelationshipEndMembers)
         {
            Console.Write("   End Member Name: {0} ", endMember.Name);
         }
      }
  }

  // Returns the keys in a string format.
  private static string GetKeys(ICollection<EdmMember> keyMembers)
  {
    StringBuilder result = new StringBuilder();
    foreach (EdmMember member in keyMembers)
    {
        if (result.Length != 0)
        {
            result.Append(" ");
         }
        result.Append(member.Name);
    }
    return result.ToString();
  }
}
Imports System
Imports System.Data
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Text
Imports System.Data.EntityClient
Imports System.Data.Metadata.Edm

Class GetMembersExample
  Public 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 members of entity types and relationship types.
         GetMembers(workspace, 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 GetMembers(ByVal workspace As MetadataWorkspace, _
      ByVal model As DataSpace)

    ' Get a collection of entity types.
    Dim entityTypes As ReadOnlyCollection(Of EntityType) = _
        workspace.GetItems(Of EntityType)(model)

    ' Iterate through the collection to get each entity type.
    Dim entityType As EntityType
    For Each entityType In entityTypes
       Console.WriteLine( _
         ControlChars.Lf & ControlChars.Lf & _
         "***EntityType Name: {0}, Namespace: {1}, RefType: {2}", _
         entityType.Name, entityType.NamespaceName, _
         entityType.GetReferenceType)

       Console.WriteLine(ControlChars.Lf & _
         "Get all members of the current EntityType object ==>")

       ' Iterate through the collection to get all members of the 
       ' current EntityType object.
       Dim member As EdmMember
       For Each member In entityType.Members
         Console.Write("   Member Name: {0} ", member.Name)
       Next

       Console.WriteLine(ControlChars.Lf & _
        "Get only the properties of the current EntityType object ==>")

       ' Iterate through the collection to get each property of the 
       ' current EntityType object.
       Dim property1 As EdmProperty
       For Each property1 In entityType.Properties
          Console.Write("   Property Name: {0} ", property1.Name)
          Console.WriteLine( _
           "   Property declaring Type: {0}, edmtype: {1}, default: {2}, nullable: {3} ", _
           New Object() {property1.DeclaringType, _
           property1.TypeUsage.EdmType, _
           property1.Default, property1.Nullable})
        Next

        Console.WriteLine(ControlChars.Lf & _
          "Get only the navigation properties of the current EntityType object ==>")

        ' Iterate through the collection to get each navigation 
        ' property of the current EntityType object.
        Dim property2 As NavigationProperty
        For Each property2 In entityType.NavigationProperties
          Console.Write( _
       "Name: {0}, RelationshipTypeName: {1}, ToEndMemberName: {2} ", _
          property2.Name, property2.RelationshipType.Name, _
          property2.ToEndMember.Name)
        Next

          Console.WriteLine(ControlChars.Lf & _
       "Get only the key members of the current EntityType object ==>")
          ' Iterate through the collection to get each key members of 
          ' the current EntityType object.
          Dim collectionKeyMembers As _
            ReadOnlyMetadataCollection(Of EdmMember) = _
            entityType.KeyMembers
          If (collectionKeyMembers.Count <> 0) Then
           Console.Write("   Key: {0} ", GetKeys(collectionKeyMembers))
          End If
        Next

        ' Get a collection of relationship types.
        Dim relationshipTypes As _
           ReadOnlyCollection(Of RelationshipType) = _
           workspace.GetItems(Of RelationshipType)(model)

        ' Iterate through the collection to get each relationship type.
        Dim relationType As RelationshipType
        For Each relationType In relationshipTypes
          Console.WriteLine(ControlChars.Lf & ControlChars.Lf & _
            "RelationshipType Name: {0}, Namespace: {1}", _
             relationType.Name, relationType.NamespaceName)
          Console.WriteLine(ControlChars.Lf & _
          "Get all members of the current RelationshipType object ==>")

          ' Iterate through the collection to get all members of the
          ' current RelationshipType object.
          Dim member As EdmMember
          For Each member In relationType.Members
              Console.Write("   Member Name: {0} ", member.Name)
          Next

          Console.WriteLine(ControlChars.Lf & _
           "Get only the end members of the current RelationshipType object ==>")
          Dim endMember As RelationshipEndMember

          ' Iterate through the collection to get only the 
          ' end members of
          ' the current RelationshipType object.
          For Each endMember In relationType.RelationshipEndMembers
            Console.Write("   End Member Name: {0} ", endMember.Name)
          Next
      Next
  End Sub

  Public Shared Function GetKeys(ByVal keyMembers As _
      ICollection(Of EdmMember)) As String
    Dim result As New StringBuilder
    Dim member As EdmMember
    For Each member In keyMembers
       If (result.Length <> 0) Then
            result.Append(" ")
       End If
       result.Append(member.Name)
    Next
      Return result.ToString
  End Function
End Class

Siehe auch

Konzepte

Typen (Metadaten)
Metadatentyp-Hierarchie
Übersicht über die Metadatentyp-Hierarchie