Insiemi di elementi (metadati)
In Entity Data Model (EDM) gli insiemi di elementi sono responsabili del caricamento dei metadati da risorse persistenti, ad esempio file XML o assembly CLR (Common Language Runtime), e sono inclusi un'istanza della classe MetadataWorkspace.
ADO.NET fornisce una classe ItemCollection come API di base per il caricamento e la conservazione in memoria dei metadati. L'oggetto ItemCollection ha diverse classi derivate, ad esempio ObjectItemCollection, EdmItemCollection, StoreItemCollection e StorageMappingItemCollection. Ognuna di queste classi Collection è specializzata per un tipo diverso di metadati. Nelle sezioni seguenti viene illustrato in che modo queste classi Collection interagiscono con tipi diversi di metadati.
ObjectItemCollection
La classe ObjectItemCollection è responsabile per il caricamento dei metadati relativi al modello a oggetti. Il modello a oggetti rappresenta le classi CLR che possono essere utilizzate come una realizzazione programmatica del modello concettuale.
Tramite ObjectItemCollection viene eseguita una ricerca di assembly a cui si fa riferimento decorati con EdmSchemaAttribute, quindi vengono caricate le classi negli assembly che corrispondono alle classi permanenti per ADO.NET Entity Framework. In particolare, vengono caricate le classi che derivano da System.Data.Objects.DataClasses.
Quando le classi non esistono negli assembly a cui si fa riferimento, l'infrastruttura dei metadati ADO.NET carica implicitamente i metadati CLR in Entity Framework. Quando, ad esempio, si crea una nuova istanza della classe ObjectQuery<T> per costruire una query, l'infrastruttura dei metadati ADO.NET controlla se il parametro del tipo <T> è già incluso nei metadati o no. Se il parametro del tipo <T> non è incluso nei metadati, l'infrastruttura dei metadati ADO.NET carica i metadati dall'assembly che include implicitamente il parametro del tipo <T>.
È anche possibile caricare i metadati da un assembly specifico al quale non si fa riferimento in modo esplicito nell'applicazione corrente. In questo caso, è possibile richiamare o il metodo LoadFromAssembly definito nella classe MetadataWorkspace o il metodo LoadFromAssembly definito nella classe ObjectItemCollection.
Il metodo LoadFromAssembly accede internamente ai relativi oggetti ObjectItemCollection registrati e chiama il metodo LoadFromAssembly definito nella classe ObjectItemCollection.
Nell'esempio di codice seguente viene illustrato come caricare i metadati da un assembly specifico. Nell'esempio di codice viene utilizzato il modello AdventureWorks per aprire una connessione al database sottostante. Viene quindi caricato in modo esplicito il modello Human Resources Skills. Per ulteriori informazioni sui modelli AdventureWorks e Human Resources Skills, vedere Modello completo di AdventureWorks (EDM) e Applicazione WinApp relativa alle competenze delle risorse umane (applicazione di esempio 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
Una classe EdmItemCollection è responsabile per il caricamento dei metadati relativi al modello concettuale. La classe EdmItemCollection carica i metadati da un file CSDL (Conceptual Schema Definition Language), che è una rappresentazione XML del modello concettuale.
Le classi EdmItemCollection e StoreItemCollection possono essere create da origini persistenti quali file, risorse negli assembly o da XmlReader.
StoreItemCollection
Una classe StoreItemCollection è responsabile per il caricamento dei metadati relativi al modello (database) di archiviazione. La classe StoreItemCollection carica i metadati da un file SSDL (Store Schema Definition Language), che è una rappresentazione XML del modello di archiviazione.
Le classi EdmItemCollection e StoreItemCollection possono essere create da origini persistenti quali file, risorse negli assembly o da XmlReader.
StorageMappingItemCollection
Una classe StorageMappingItemCollection è responsabile per il caricamento dei metadati che rappresentano il mapping tra il modello concettuale e il modello (database) di archiviazione. La classe StorageMappingItemCollection carica i metadati da un file MSL (Mapping Specification Language), che è una rappresentazione XML del mapping tra il modello concettuale e il modello di archiviazione.