Compartir a través de


Tipos estructurales (metadatos)

En el Entity Data Model (EDM), los tipos estructurales son tipos de EDM que tienen miembros. Los miembros definen el contenido de los tipos derivados de la clase StructuralType. La clase StructuralType tiene varios tipos derivados, como EntityType, RelationshipType y ComplexType.

EntityType representa un concepto de nivel superior, como un cliente o un pedido en el EDM. RelationshipType es un tipo base de AssociationType que representa una asociación del EDM. Para obtener más información acerca de las entidades y asociaciones en el EDM, vea Tipo de entidad (EDM) y Asociación (EDM).

ComplexType representa un tipo que incluye un conjunto de propiedades como un tipo de entidad, pero no incluye una propiedad clave. Para obtener más información acerca de los tipos complejos en el EDM, vea Tipo complejo (EDM).

En los esquemas EDM, EntityType, RelationshipType y ComplexType tienen subelementos o miembros. Por ejemplo, las propiedades de un tipo de entidad son sus miembros; de igual modo, los extremos de una relación también son sus miembros. Cada miembro tiene un tipo declarativo y la restricción Nullability o una asignación de valor predeterminado.

En las siguientes secciones se proporciona información detallada acerca de los miembros.

Miembros

En el EDM, los miembros definen el contenido de los tipos derivados de la clase StructuralType. Por ejemplo, la siguiente representación de XML corresponde al archivo del esquema conceptual (.csdl) de AdventureWorks que se proporciona en Esquema conceptual completo de AdventureWorks (EDM). Esta representación XML define el EntityType de Department. Los miembros de la entidad Department son DepartmentID, Name, GroupName, ModifiedDate y 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>

También puede obtener una lista de miembros de cualquier tipo estructural usando la propiedad System.Data.Metadata.Edm.StructuralType.Members proporcionada por StructuralType. La propiedad Members devuelve una colección ReadOnlyMetadataCollection que contiene los objetos EdmMember.

Los tipos que derivan de StructuralType almacenan sus miembros en la propiedad Members heredada de StructuralType.

Además de la propiedad Members heredada de StructuralType, cada tipo derivado proporciona algunas propiedades adicionales para obtener la lista de miembros especiales que se pueden declarar en ese tipo. Por ejemplo, System.Data.Metadata.Edm.EntityType.Properties devuelve una colección que contiene los objetos EdmProperty.

De igual modo, RelationshipType contiene una propiedad System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers que devuelve una colección de objetos RelationshipEndMember. Observe que tanto EdmProperty como RelationshipEndMember se derivan de EdmMember.

En la siguiente lista se ofrece un conjunto de las propiedades que se pueden usar para recuperar los miembros de los tipos estructurales:

  • System.Data.Metadata.Edm.EntityType.Members: obtiene una lista de todos los miembros del objeto EntityType. Los miembros de EntityType pueden incluir propiedades, propiedades de navegación y miembros clave del objeto EntityType. La propiedad System.Data.Metadata.Edm.EntityType.Members se hereda de la clase StructuralType. Para obtener más información sobre cómo especificar los miembros de EntityType en un esquema conceptual, vea Elemento EntityType (CSDL).

  • System.Data.Metadata.Edm.EntityType.Properties: obtiene una lista de todas las propiedades del objeto EntityType. Para obtener más información sobre cómo especificar las propiedades de EntityType en un esquema conceptual, vea Tipo de entidad (EDM) y Elemento EntityType (CSDL).

  • System.Data.Metadata.Edm.EntityType.NavigationProperties: obtiene una lista de las propiedades de navegación del objeto EntityType. Para obtener más información sobre cómo especificar las propiedades de navegación de EntityType en un esquema conceptual, vea Tipo de entidad (EDM) y Elemento EntityType (CSDL).

  • System.Data.Metadata.Edm.EntityType.KeyMembers: obtiene una lista de todos los miembros clave del objeto EntityType. Esta propiedad se hereda de la clase EntityTypeBase.

  • System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers: obtiene una lista de los miembros End del objeto RelationshipType.

  • System.Data.Metadata.Edm.AssociationType.AssociationEndMembers: obtiene una lista de los miembros End del objeto AssociationType. Para obtener más información sobre cómo especificar los miembros End de AssociationType en un esquema conceptual, vea Elemento Association (CSDL).

  • System.Data.Metadata.Edm.ComplexType.Properties: obtiene una lista de todas las propiedades del objeto ComplexType. Para obtener más información sobre cómo especificar las propiedades de ComplexType en un esquema conceptual, vea Tipo complejo (EDM) y Cómo definir un modelo con un tipo complejo (Entity Framework). El ejemplo de código de la clase ComplexType demuestra cómo recuperar las propiedades de los tipos complejos del modelo especificado.

En el ejemplo de código siguiente se obtiene un área de trabajo de metadatos desde la conexión, que se usa para recuperar información acerca de los miembros de los tipos de entidad y relación del modelo especificado. Observe que el área de trabajo de metadatos es un componente del servicio en tiempo de ejecución que proporciona compatibilidad para recuperar los metadatos.

El ejemplo de código usa CSpace para especificar el modelo. CSpace representa el nombre predeterminado del modelo conceptual. En el ejemplo de código siguiente se usa el modelo de AdventureWorks que se proporciona en el tema Modelo completo (EDM) de AdventureWorks. Para obtener un ejemplo del archivo de configuración de la aplicación, vea Usar el modelo de objetos de AdventureWorks (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

Vea también

Conceptos

Tipos (metadatos)
Jerarquía de tipos de metadatos
Introducción a la jerarquía de tipos de metadatos