高度なメタデータ ワークスペース
このトピックでは、MetadataWorkspace クラスの高度な使用法として、このクラスを使って Entity Data Model (EDM) 内のメタデータ情報を取得する方法について説明します。そのためには、最初に MetadataWorkspace クラスの新しいインスタンスを作成する必要があります。次に、項目コレクションをこのメタデータ ワークスペースに登録します。
項目コレクションは、メタデータを読み込んでメタデータ ワークスペースで利用できるようにする役割を持ちます。項目コレクションの詳細については、「項目コレクション (メタデータ)」を参照してください。
System.Data.Metadata.Edm 名前空間は、項目コレクションをメタデータ ワークスペースに登録するための RegisterItemCollection メソッドを提供します。
RegisterItemCollection メソッドによって、それぞれのモデルで 1 つの項目コレクションのみ登録されることが保証されます。それぞれの項目コレクションは、特定のモデルに関するメタデータを読み込む役割を持ちます。ADO.NET エンティティ フレームワーク を使用する一般的なアプリケーションのモデルの詳細については、「メタデータ ワークスペースの概要」を参照してください。
このドキュメントのコード サンプルでは、MetadataWorkspace クラスの新しいインスタンスを作成します。次に、概念 (.csdl) モデルに関するメタデータを読み込む EdmItemCollection クラスの新しいインスタンスと、ストレージ (.ssdl) モデルに関するメタデータを読み込む StoreItemCollection クラスの新しいインスタンスを作成および登録します。
次に、このコード サンプルでは、メタデータ ワークスペースを使用して、指定されたモデルで使用されているすべての型に関する情報を取得します。メタデータ ワークスペースは、メタデータの取得をサポートするランタイム サービス コンポーネントです。
このコード サンプルでは、CSpace と SSpace を使用してモデルを指定します。CSpace は、概念モデルの既定の名前を表します。SSpace は、ストレージ モデルの既定の名前を表します。
次のコード サンプルを実行するには、概念 (.csdl) スキーマ ファイル、ストレージ (.ssdl) スキーマ ファイル、およびマッピング (.msl) スキーマ ファイルがデータ フォルダに格納されている必要があります。さらに、FileName 入力パラメータを使用して、マッピング スキーマ ファイルの名前を設定する必要があります。このサンプルでは、「AdventureWorks Complete Model (EDM)」で定義されている AdventureWorks モデルを使用します。
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