Types structurels (Métadonnées)
Dans le modèle EDM (Modèle de données d'entité), les types structurels sont des types EDM qui ont des membres. Les membres définissent le contenu des types dérivés de la classe StructuralType. La classe StructuralType possède plusieurs types dérivés, comme EntityType, RelationshipType et ComplexType.
L'objet EntityType représente un concept de niveau supérieur, tel qu'un client ou une commande dans le modèle EDM. L'objet RelationshipType est un type de base pour le type AssociationType qui représente une association du modèle EDM. Pour plus d'informations sur les entités et les associations du modèle EDM, voir Type d'entité (EDM) et Association (EDM).
L'objet ComplexType représente un type qui inclut un ensemble de propriétés, comme un type d'entité, mais qui n'inclut pas de propriété de clé. Pour plus d'informations sur les types complexes du modèle EDM, voir Type complexe (EDM).
Dans les schémas EDM, les objets EntityType, RelationshipType et ComplexType ont des sous-éléments ou des membres. Par exemple, les propriétés d'un type d'entité sont ses membres ; de même, les terminaisons d'une relation sont également ses membres. Chaque membre a un type déclarant et peut avoir la contrainte Nullability ou une affectation de valeur par défaut.
Les sections ci-dessous fournissent des informations détaillées sur les membres.
Membres
Dans le modèle EDM, les membres définissent le contenu des types dérivés de la classe StructuralType. Par exemple, la représentation XML suivante est issue du fichier du schéma conceptuel AdventureWorks (.csdl) donné dans la rubrique Schéma conceptuel complet AdventureWorks (EDM). Cette représentation XML définit l'objet EntityType de l'entité Department. Les membres de l'entité Department sont DepartmentID, Name, GroupName, ModifiedDate et 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>
Vous pouvez obtenir une liste de membres sur tout type structurel en utilisant la propriété System.Data.Metadata.Edm.StructuralType.Members fournit par l'objet StructuralType. La propriété Members retourne un objet ReadOnlyMetadataCollection qui contient les objets EdmMember.
Les types qui dérivent de l'objet StructuralType stockent leurs membres dans la propriété Members héritée de l'objet StructuralType.
Outre la propriété Members héritée de l'objet StructuralType , chaque type dérivé fournit des propriétés supplémentaires permettant d'obtenir la liste des membres spéciaux qui peuvent être déclarés sur ce type. Par exemple, System.Data.Metadata.Edm.EntityType.Properties retourne une collection qui contient les objets EdmProperty.
De même, RelationshipType contient la propriété System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers qui retourne une collection d'objets RelationshipEndMember. Notez que l'objet EdmProperty et l'objet RelationshipEndMember sont tous les deux dérivés de l'objet EdmMember.
La liste suivante fournit un ensemble de propriétés que vous pouvez utiliser pour récupérer les membres des types structurels :
System.Data.Metadata.Edm.EntityType.Members : Obtient la liste de tous les membres de l'objet EntityType. Les membres de l'objet EntityType peuvent inclure les propriétés, les propriétés de navigation et les membres clés de l'objet EntityType. La propriété System.Data.Metadata.Edm.EntityType.Members est héritée de la classe StructuralType. Pour plus d'informations sur la façon de spécifier les membres de l'objet EntityType d'un schéma conceptuel, voir Élément EntityType (CSDL).
System.Data.Metadata.Edm.EntityType.Properties : Obtient la liste des propriétés de l'objet EntityType. Pour plus d'informations sur la façon de spécifier les propriétés de l'objet EntityType d'un schéma conceptuel, voir Type d'entité (EDM) et Élément EntityType (CSDL).
System.Data.Metadata.Edm.EntityType.NavigationProperties : Obtient la liste des propriétés de navigation de l'objet EntityType. Pour plus d'informations sur la façon de spécifier les propriétés de navigation de l'objet EntityType d'un schéma conceptuel, voir Type d'entité (EDM) et Élément EntityType (CSDL).
System.Data.Metadata.Edm.EntityType.KeyMembers : Obtient la liste des membres clés de l'objet EntityType. Cette propriété est héritée de la classe EntityTypeBase.
System.Data.Metadata.Edm.RelationshipType.RelationshipEndMembers : Obtient la liste des membres End de l'objet RelationshipType.
System.Data.Metadata.Edm.AssociationType.AssociationEndMembers : Obtient la liste des membres End de l'objet AssociationType. Pour plus d'informations sur la façon de spécifier les membres End de l'objet AssociationType d'un schéma conceptuel, voir Élément Association (CSDL).
System.Data.Metadata.Edm.ComplexType.Properties : Obtient la liste des propriétés de l'objet ComplexType. Pour plus d'informations sur la façon de spécifier les propriétés de l'objet ComplexType d'un schéma conceptuel, voir Type complexe (EDM) et Procédure : définir un modèle avec des types complexes (Entity Framework). L'exemple de code de la classe ComplexType montre comment récupérer les propriétés des types complexes du modèle spécifié.
L'exemple de code suivant obtient un espace de travail des métadonnées à partir de la connexion, puis utilise cet espace de travail des métadonnées pour récupérer les informations sur les membres de l'entité et les types de relations du modèle spécifié. Notez que l'espace de travail des métadonnées est un composant de service du runtime qui fournit une prise en charge de la récupération des métadonnées.
L'exemple de code utilise un CSpace pour spécifier le modèle. CSpace représente le nom par défaut du modèle conceptuel. L'exemple de code utilise le modèle AdventureWorks fourni dans la rubrique Modèle complet AdventureWorks (EDM). Pour obtenir un exemple du fichier de configuration d'application, voir Utilisation du modèle objet 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
Voir aussi
Concepts
Types (Métadonnées)
Hiérarchie des types de métadonnées
Vue d'ensemble de la hiérarchie des types de métadonnées