Усовершенствованная рабочая область метаданных
В данном разделе рассказывается о дополнительных способах применения класса MetadataWorkspace для получения метаданных внутри модели EDM. Для этого нужно сначала создать новый экземпляр класса MetadataWorkspace. Затем надо зарегистрировать коллекции элементов в этой рабочей области метаданных.
Коллекции элементов ответственны за загрузку метаданных и осуществление доступа к ним через рабочую область метаданных. Дополнительные сведения об использовании коллекций элементов см. в разделе Коллекции элементов (метаданные).
Пространство имен System.Data.Metadata.Edm предоставляет метод RegisterItemCollection для регистрации коллекций элементов в рабочей области метаданных.
Метод RegisterItemCollection гарантирует, что для каждой модели будет зарегистрирована только одна коллекция элементов. Каждая коллекция элементов несет ответственность за загрузку метаданных конкретной модели. Дополнительные сведения о моделях в типичном приложении, использующем платформу ADO.NET Entity Framework, см. в разделе Общие сведения о рабочей области метаданных.
Образец кода в этом документе создает новый экземпляр класса MetadataWorkspace. Далее в образце программного кода создается и регистрируется новый экземпляр класса EdmItemCollection для загрузки метаданных концептуальной модели (файл CSDL) и новый экземпляр класса StoreItemCollection для загрузки метаданных модели хранения (файл SSDL).
Далее в образце кода демонстрируется использование рабочей области метаданных для получения информации обо всех типах указанной модели. Обратите внимание, что рабочая область метаданных — это служебный компонент времени выполнения, который обеспечивает поддержку извлечения метаданных.
В этом образце кода для указания модели используются элементы CSpace и SSpace. Элемент CSpace представляет собой имя по умолчанию для концептуальной модели. Имя SSpace используется по умолчанию для модели хранения.
Для запуска приведенного ниже образца кода папка данных должна содержать файлы следующих схем: концептуальной (CSDL), схемы хранения (SSDL) и схемы сопоставления (MSL). Нужно также задать в качестве значения входного параметра FileName имя файла схемы сопоставления. В образце используется модель AdventureWorks, определенная в разделе Полная модель 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