次の方法で共有


項目コレクション (メタデータ)

エンティティ データ モデル (EDM) では、XML ファイルや共通言語ランタイム (CLR) アセンブリなどの永続的リソースからのメタデータの読み込みが、MetadataWorkspace クラスのインスタンスに存在する項目コレクションによって行われます。

ADO.NET には、インメモリのメタデータを読み込んだり保持したりするためのコア API として、ItemCollection クラスが用意されています。ItemCollection には、ObjectItemCollectionEdmItemCollectionStoreItemCollectionStorageMappingItemCollection など、複数の派生クラスがあります。これらのコレクション クラスは、それぞれ異なる種類のメタデータに特化して設計されています。以降のセクションでは、これらのコレクション クラスと各種メタデータとの連携のしくみについて説明します。

ObjectItemCollection

ObjectItemCollection クラスは、オブジェクト モデルに関するメタデータの読み込みを行います。オブジェクト モデルは、概念モデルをプログラムで実現することが可能な CLR クラスを表します。

ObjectItemCollection は、EdmSchemaAttribute で修飾された参照アセンブリを探し、そのアセンブリから ADO.NET エンティティ フレームワーク の永続クラスに対応するクラスを読み込みます。具体的には、System.Data.Objects.DataClasses から派生したクラスが読み込まれます。

該当するクラスが参照アセンブリに存在しなかった場合、ADO.NET のメタデータ インフラストラクチャによって、エンティティ フレームワーク 内の CLR メタデータが暗黙的に読み込まれます。たとえば、ObjectQuery<T> クラスの新しいインスタンスを作成してクエリを構築する場合、型パラメータ <T> が既にメタデータ内に存在するかどうかが、ADO.NET のメタデータ インフラストラクチャによって確認されます。型パラメータ <T> がメタデータ内に存在しない場合、ADO.NET メタデータ インフラストラクチャは、型パラメータ <T> を含んでいるアセンブリから、暗黙的にメタデータを読み込みます。

メタデータは、現在のアプリケーションで明示的に参照されていない特定のアセンブリから読み込むこともできます。この場合、MetadataWorkspace クラスで定義されている LoadFromAssembly メソッドを呼び出すか、ObjectItemCollection クラスで定義されている LoadFromAssembly メソッドを呼び出すことができます。

LoadFromAssembly メソッドは、登録されている ObjectItemCollection に内部的にアクセスし、ObjectItemCollection クラスに定義されている LoadFromAssembly メソッドを呼び出します。

次のコード サンプルは、メタデータを特定のアセンブリから読み込む方法を示しています。このコード サンプルでは、AdventureWorks モデルを使って、基になるデータベースへの接続を開いています。次に、Human Resources Skills モデルを明示的に読み込みます。AdventureWorks モデルおよび Human Resources Skills モデルの詳細については、「AdventureWorks Complete Model (EDM)」および「Human Resources Skills WinApp (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

EdmItemCollection クラスは、概念モデルに関するメタデータの読み込みを行います。EdmItemCollection クラスは、そのメタデータを、概念モデルの XML 表現である概念スキーマ定義言語 (CSDL) ファイルから読み込みます。

EdmItemCollection および StoreItemCollection は、ファイルなどの永続的なソース、アセンブリのリソース、または XmlReader から作成できます。

StoreItemCollection

StoreItemCollection クラスは、ストレージ (データベース) モデルに関するメタデータの読み込みを行います。StoreItemCollection クラスは、そのメタデータを、ストレージ モデルの XML 表現であるストア スキーマ定義言語 (SSDL) ファイルから読み込みます。

EdmItemCollection および StoreItemCollection は、ファイルなどの永続的なソース、アセンブリのリソース、または XmlReader から作成できます。

StorageMappingItemCollection

StorageMappingItemCollection クラスは、概念モデルとストレージ (データベース) モデル間のマッピングを表すメタデータの読み込みを行います。StorageMappingItemCollection クラスは、そのメタデータをマッピング スキーマ言語 (MSL) ファイルから読み込みます。MSL ファイルは、概念モデルとストレージ モデル間のマッピングを XML 形式で表現したものです。

参照

概念

メタデータ ワークスペース