Espace de travail des métadonnées avancé
Cette rubrique décrit l'utilisation avancée de la classe MetadataWorkspace pour récupérer des informations de métadonnées dans le modèle EDM (Entity Data Model). Pour ce faire, vous devez d'abord créer une nouvelle instance de la classe MetadataWorkspace. Vous devez ensuite inscrire les collections d'éléments avec cet espace de travail des métadonnées.
Les collections d'éléments sont responsables du chargement des métadonnées et de leur mise à disposition via l'espace de travail des métadonnées. Pour plus d'informations sur les collections d'éléments, voir Collections d'éléments (métadonnées).
L'espace de noms System.Data.Metadata.Edm fournit la méthode RegisterItemCollection pour inscrire les collections d'éléments avec l'espace de travail des métadonnées.
La méthode RegisterItemCollection garantit qu'une seule collection d'éléments est inscrite pour chaque modèle. Chaque collection d'éléments est responsable du chargement des métadonnées relatives à un modèle spécifique. Pour plus d'informations sur les modèles d'une application classique qui utilise ADO.NET Entity Framework, voir Vue d'ensemble de la classe MetadataWorkspace.
L'exemple de code de ce document crée une nouvelle instance de la classe MetadataWorkspace. Il crée et inscrit ensuite une nouvelle instance de la classe EdmItemCollection pour charger les métadonnées relatives au modèle conceptuel (.csdl), et une nouvelle instance de la classe StoreItemCollection pour charger les métadonnées relatives au modèle de stockage (.ssdl).
L'exemple de code montre ensuite comment utiliser l'espace de travail des métadonnées pour récupérer les informations relatives à tous les types 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 et un SSpace pour spécifier les modèles. Le CSpace représente le nom par défaut du modèle conceptuel. Le SSpace représente le nom par défaut du modèle de stockage.
Pour exécuter l'exemple de code ci-dessous, votre dossier de données doit contenir les fichiers de schéma conceptuel (.csdl), de stockage (.ssdl) et de mappage (.msl). Vous devez également affecter au paramètre d'entrée FileName le nom de votre fichier de schéma de mappage. L'exemple utilise le modèle AdventureWorks qui est défini dans Modèle complet AdventureWorks (EDM).
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.ObjectModel;
using System.Data.Metadata.Edm;
class AdvancedGetTypeExample
{
// The data folder contains the EDM schemas such as
// conceptual schema file (.csdl),
// the storage schema file (.ssdl),
// and the mapping file (.msl).
private const string
PathToDataFolder = @"..\..\..\..\Adventureworks\Adventureworks";
private const string
ConnectionString = @"server=serverName;database=Adventureworks;Integrated Security=true";
static void Main()
{
try
{
// Construct a new instance of the metadata workspace.
MetadataWorkspace workspace = new MetadataWorkspace();
// Create a new item collection with the specified
// connection and the folder info
// where the entity data model (EDM) schemas exist.
EdmItemCollection edmCollection =
new EdmItemCollection(PathToDataFolder);
// Register the item collection with the metadata workspace.
workspace.RegisterItemCollection(edmCollection);
// Create a new item collection with the specified
// connection and the folder info
// where the entity data model (EDM) schemas exist.
// SqlConnection object is used to supply the types to
// the StoreItemCollection.
StoreItemCollection storeCollection =
new StoreItemCollection(PathToDataFolder);
// Register the item collection with the metadata workspace.
workspace.RegisterItemCollection(storeCollection);
// Get items from the conceptual model.
GetItemsFromModel(workspace, DataSpace.CSpace);
// Get items from the storage model.
GetItemsFromModel(workspace, DataSpace.SSpace);
}
catch (MetadataException exceptionMetadata)
{
Console.WriteLine("MetadataException: {0}",
exceptionMetadata.Message);
}
catch (System.Data.MappingException exceptionMapping)
{
Console.WriteLine("MappingException: {0}",
exceptionMapping.Message);
}
}
public static void GetItemsFromModel
(MetadataWorkspace workspace, DataSpace model)
{
Console.WriteLine("Display items at the {0} model",
model.ToString());
// An EdmType class is the base class for the classes that
// represent types in the Entity Data Model (EDM).
ReadOnlyCollection<EdmType> types =
workspace.GetItems<EdmType>(model);
// For the conceptual model (DataSpace.CSpace):
// This collection contains all types defined in .csdl file and
// also
// the canonical functions and primitive types defined
// in the Entity Data Model (EDM).
// For the storage model (DataSpace.SSpace):
// This collection contains all types defined in .ssdl file
// and also
// all SQL Server primitive types and functions.
// Iterate through the collection to get each type.
foreach (EdmType item in types)
{
Console.WriteLine("Type: {0}, Type in Model: {1} ",
item.GetType().FullName, item.FullName);
}
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Collections.ObjectModel
Imports System.Data.Metadata.Edm
Class AdvancedGetTypeExample
' The data folder contains the EDM schemas such as
' conceptual schema file (.csdl),
' the storage schema file (.ssdl),
' and the mapping file (.msl).
Private Const PathToDataFolder As String = _
"..\..\..\..\Adventureworks\Adventureworks"
Private Const ConnectionString As String = _
"server=serverName;database=Adventureworks;Integrated Security=true"
Public Shared Sub Main()
Try
' Construct a new instance of the metadata workspace.
Dim workspace As MetadataWorkspace = New MetadataWorkspace()
' Create a new item collection with the specified
' connection and the folder info
' where the entity data model (EDM) schemas exist.
Dim edmCollection As New EdmItemCollection(PathToDataFolder)
' Register the item collection with the metadata workspace.
workspace.RegisterItemCollection(edmCollection)
' Create a new item collection with the specified
' connection and the folder info
' where the entity data model (EDM) schemas exist.
' SqlConnection object is used to supply the types to
' the StoreItemCollection.
Dim storeCollection As New StoreItemCollection(PathToDataFolder)
' Register the item collection with the metadata workspace.
workspace.RegisterItemCollection(storeCollection)
' Get items from the conceptual model.
GetItemsFromModel(workspace, DataSpace.CSpace)
' Get items from the storage model.
GetItemsFromModel(workspace, DataSpace.SSpace)
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 GetItemsFromModel( _
ByVal workspace As MetadataWorkspace, _
ByVal model As DataSpace)
Console.WriteLine("Display items at the {0} model", model.ToString)
' An EdmType class is the base class for the classes that
' represent types in the Entity Data Model (EDM).
Dim types As ReadOnlyCollection(Of EdmType) = _
workspace.GetItems(Of EdmType)(model)
' For the conceptual model (DataSpace.CSpace):
' This collection contains all types defined in .csdl file and also
' the canonical functions and primitive types defined
' in the Entity Data Model (EDM).
' For the storage model (DataSpace.SSpace):
' This collection contains all types defined in .ssdl file and also
' all SQL Server primitive types and functions.
' Iterate through the collection to get each type.
Dim item As EdmType
For Each item In types
Console.WriteLine( _
"Type: {0}, Type in Model: {1} ", _
item.GetType.FullName, item.FullName)
Next
End Sub
End Class