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


Структурные типы (метаданные)

В модели Entity Data Model (EDM) структурными типами являются типы EDM, имеющие элементы. Элементы определяют содержимое типов, производных от класса StructuralType. Класс StructuralType имеет несколько производных типов, например EntityType, RelationshipType и ComplexType.

Тип EntityType представляет сущность верхнего уровня, например клиента или заказ в модели EDM. Тип RelationshipType является базовым типом для типа AssociationType, представляющего ассоциацию в модели EDM. Дополнительные сведения о сущностях и ассоциациях в модели EDM см. в разделах Тип сущности (модель EDM) и Элемент Association (модель EDM).

ComplexType представляет тип, включающий набор таких свойств, как тип сущности, но не содержит ключевое свойство. Дополнительные сведения о сложных типах в модели EDM см. в разделе Сложный тип (модель EDM).

В EDM-схемах типы EntityType, RelationshipType и ComplexType имеют вложенные элементы или члены. Например, свойства типа сущности являются его элементами. Аналогично конечные точки связи также являются ее элементами. Каждый элемент имеет объявляющий тип и может иметь ограничение на допустимость значений NULL или значение по умолчанию.

В следующих разделах приводятся подробные сведения об элементах.

Элементы

В модели EDM элементы типа определяют содержимое типов, производных от класса StructuralType. Например, следующее XML-представление взято из файла концептуальной схемы AdventureWorks (CSDL) в разделе Полная концептуальная схема AdventureWorks (модель EDM). Это XML-представление определяет сущность Department типа EntityType. Элементами сущности Department являются DepartmentID, Name, GroupName, ModifiedDate и 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>

Список элементов любого структурного типа можно вернуть с помощью свойства System.Data.Metadata.Edm.StructuralType.Members, предоставляемого типом StructuralType. Свойство Members возвращает коллекцию ReadOnlyMetadataCollection, содержащую объекты EdmMember.

Производные типы StructuralType хранят свои элементы в свойстве Members, унаследованном от типа StructuralType.

Кроме свойства Members, унаследованного от типа StructuralType, каждый производный тип предоставляет некоторые дополнительные свойства, возвращающие список особых элементов, которые можно объявить в этом типе. Например, System.Data.Metadata.Edm.EntityType.Properties возвращает коллекцию, содержащую объекты EdmProperty.

Точно так же тип RelationshipType содержит свойство System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers, возвращающее коллекцию объектов RelationshipEndMember. Обратите внимание, что типы EdmProperty и RelationshipEndMember являются производными от класса EdmMember.

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

  • System.Data.Metadata.Edm.EntityType.Members. Возвращает список всех элементов объекта типа EntityType. Элементы типа EntityType могут включать свойства, свойства навигации и ключевые элементы объекта EntityType. Свойство System.Data.Metadata.Edm.EntityType.Members наследуется от класса StructuralType. Дополнительные сведения о способе указания элементов типа EntityType в концептуальной схеме см. в разделе Элемент EntityType (язык CSDL).

  • System.Data.Metadata.Edm.EntityType.Properties. Возвращает список свойств объекта EntityType. Дополнительные сведения о способе указания свойств EntityType в концептуальной схеме см. в разделах Тип сущности (модель EDM) и Элемент EntityType (язык CSDL).

  • System.Data.Metadata.Edm.EntityType.NavigationProperties. Возвращает список свойств навигации объекта EntityType. Дополнительные сведения о способах указания свойств навигации типа EntityType в концептуальной схеме см. в разделах Тип сущности (модель EDM) и Элемент EntityType (язык CSDL).

  • System.Data.Metadata.Edm.EntityType.KeyMembers. Возвращает список ключевых элементов объекта EntityType. Это свойство наследуется от класса EntityTypeBase.

  • System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers. Возвращает список элементов End объекта RelationshipType.

  • System.Data.Metadata.Edm.AssociationType.AssociationEndMembers. Возвращает список элементов End объекта AssociationType. Дополнительные сведения о способе указания элементов End для объекта AssociationType в концептуальной схеме см. в разделе Элемент Association (язык CSDL).

  • System.Data.Metadata.Edm.ComplexType.Properties. Возвращает список свойств объекта ComplexType. Дополнительные сведения о способе указания свойств ComplexType в концептуальной схеме см. в разделах Сложный тип (модель EDM) и Как определить модель со сложным типом (платформа Entity Framework). В образце кода в классе ComplexType показано получение свойств сложных типов в заданной модели.

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

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

См. также

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

Типы (метаданные)
Иерархия типов метаданных
Общие сведения об иерархии типов метаданных