Collections d'éléments (métadonnées)
Dans le modèle EDM (Modèle de données d'entité), les collections d'éléments (item) sont responsables du chargement des métadonnées à partir de ressources persistantes, comme des fichiers XML ou des assemblys CLR (Common Language Runtime), et se trouvent dans une instance de la classe MetadataWorkspace.
ADO.NET fournit une classe ItemCollection sous la forme d'une API principale pour le chargement et le maintien en mémoire de métadonnées. ItemCollection possède plusieurs classes dérivées, comme ObjectItemCollection, EdmItemCollection, StoreItemCollection et StorageMappingItemCollection. Chacune de ces classes de collection est spécialisée dans un type de métadonnées. Les sections qui suivent expliquent comment ces classes de collection interagissent avec différents types de métadonnées.
ObjectItemCollection
La classe ObjectItemCollection est responsable du chargement des métadonnées relatives au modèle objet. Le modèle objet représente les classes CLR qui peuvent être utilisées en tant que réalisation sous forme de programme du modèle conceptuel.
ObjectItemCollection recherche les assemblys référencés décorés avec l'attribut EdmSchemaAttribute, puis charge les classes des assemblys qui correspondent aux classes persistantes d'ADO.NET Entity Framework. Plus spécifiquement, les classes dérivées de System.Data.Objects.DataClasses sont chargées.
Lorsque les classes n'existent pas dans les assemblys référencés, l'infrastructure de métadonnées ADO.NET charge implicitement les métadonnées CLR dans Entity Framework. Par exemple, lorsque vous créez une instance de la classe ObjectQuery<T> pour construire une requête, l'infrastructure de métadonnées ADO.NET vérifie si le paramètre de type <T> figure déjà dans les métadonnées. Si le paramètre de type <T> ne figure pas dans les métadonnées, l'infrastructure de métadonnées ADO.NET charge implicitement les métadonnées de l'assembly qui incluent le paramètre de type <T>.
Vous pouvez aussi charger les métadonnées d'un assembly spécifique non explicitement référencé dans votre application actuelle. Dans ce cas, vous pouvez appeler soit la méthode LoadFromAssembly définie dans la classe MetadataWorkspace, soit la méthode LoadFromAssembly définie dans la classe ObjectItemCollection.
La méthode LoadFromAssembly accède de façon interne à sa classe ObjectItemCollection inscrite et appelle la méthode LoadFromAssembly définie dans la classe ObjectItemCollection.
L'exemple de code ci-dessous montre comment charger les métadonnées d'un assembly spécifique. Il utilise le modèle AdventureWorks pour établir une connexion avec la base de données sous-jacente. Il charge ensuite explicitement le modèle Human Resources Skills. Pour plus d'informations sur les modèles AdventureWorks et Human Resources Skills, voir Modèle complet AdventureWorks (EDM) et Human Resources Skills WinApp (Exemple d'application EDM).
Imports System
Imports System.Data
Imports System.Reflection
Imports System.Collections.ObjectModel
Imports System.Data.Metadata.Edm
Imports AdventureWorksModel
Class LoadAssemblyExample
' This sample illustrates loading metadata from a specific assembly.
Public Shared Sub Main()
Try
' Retrieve a MetadataWorkspace from an ObjectContext:
' AdventureWorksEntities represents the ADO.NET ObjectContext
' that acts as a factory for queries;
' tracks object state; and is used to initiate
' updates against the database.
Using db As AdventureWorksEntities = New AdventureWorksEntities
' Dereference the workspace from the AdventureWorksEntities
' class
' (an ObjectContext specialization).
Dim workspace As MetadataWorkspace = db.MetadataWorkspace
' Load metadata from the HRSkills assembly.
workspace.LoadFromAssembly(Assembly.Load("HRSkills"))
' Get a collection of the EdmTypes from the object model.
Dim types As ReadOnlyCollection(Of EdmType) = _
workspace.GetItems(Of EdmType)(DataSpace.OSpace)
' Iterate through the collection to get each EdmType.
Dim item As EdmType
For Each item In types
Console.WriteLine("Type: {0}, Type in Model: {1} ", _
item.GetType.FullName, item.FullName)
Next
End Using
Catch exceptionMetadata As MetadataException
Console.WriteLine("MetadataException: {0}", _
exceptionMetadata.Message)
End Try
End Sub
End Class
using System;
using System.Data;
using System.Reflection;
using System.Collections.ObjectModel;
using System.Data.Metadata.Edm;
using AdventureWorksModel;
class LoadAssemblyExample
{
// This sample illustrates loading metadata from a specific assembly.
static void Main()
{
try
{
// Retrieve a MetadataWorkspace from an ObjectContext:
// AdventureWorksEntities represents the ADO.NET ObjectContext
// that acts as a factory for queries;
// tracks object state; and is used to initiate
// updates against the database.
using (
AdventureWorksEntities db = new AdventureWorksEntities ())
{
// Dereference the workspace from the AdventureWorksEntities
// class (an ObjectContext specialization).
MetadataWorkspace workspace = db.MetadataWorkspace;
// Load metadata from the HRSkills assembly.
workspace.LoadFromAssembly(
Assembly.Load(@"HRSkills"));
// Get a collection of the EdmTypes from the object model.
ReadOnlyCollection<EdmType> types =
workspace.GetItems<EdmType>(DataSpace.OSpace);
// Iterate through the collection to get each EdmType.
foreach (EdmType item in types)
{
Console.WriteLine("Type: {0}, Type in Model: {1} ",
item.GetType().FullName, item.FullName);
}
}
}
catch (MetadataException exceptionMetadata)
{
Console.WriteLine("MetadataException: {0}",
exceptionMetadata.Message);
}
}
}
EdmItemCollection
Une classe EdmItemCollection est responsable du chargement des métadonnées relatives au modèle conceptuel. La classe EdmItemCollection charge ses métadonnées à partir d'un fichier CSDL (Conceptual Schema Definition Language), représentation au format XML du modèle conceptuel.
EdmItemCollection et StoreItemCollection peuvent être créés à partir de sources persistantes comme des fichiers et des ressources d'assemblys ou à partir de XmlReader.
StoreItemCollection
Une classe StoreItemCollection est responsable du chargement des métadonnées relatives au modèle de stockage (base de données). La classe StoreItemCollection charge ses métadonnées à partir d'un fichier SSDL (Store Schema Definition Language), représentation au format XML du modèle de stockage.
EdmItemCollection et StoreItemCollection peuvent être créés à partir de sources persistantes comme des fichiers et des ressources d'assemblys ou à partir de XmlReader.
StorageMappingItemCollection
Une classe StorageMappingItemCollection est responsable du chargement des métadonnées qui représentent le mappage entre le modèle conceptuel et le modèle de stockage (base de données). La classe StorageMappingItemCollection charge ses métadonnées à partir d'un fichier MSL (Mapping Specification Language), représentation au format XML du mappage entre le modèle conceptuel et le modèle de stockage.