Структурные типы (метаданные)
В модели 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
См. также
Основные понятия
Типы (метаданные)
Иерархия типов метаданных
Общие сведения об иерархии типов метаданных