次の方法で共有


エンティティ接続とメタデータ ワークスペース

ADO.NET エンティティ フレームワーク を使ったアプリケーション開発では、データベースへの接続に EntityConnection オブジェクトを使用できます。接続文字列は、エンティティ データ モデル (EDM) で EntityConnection クラスの新しいインスタンスを作成する際に、app.config ファイルで指定できます。この接続文字列によって、必要なモデルとマッピング、さらに、ストレージ固有のデータ プロバイダ名と接続文字列を含んだ一連のメタデータが参照されます。

EntityConnection のコンストラクタには、EntityConnectionEntityConnection があります。EntityConnection は、メタデータを参照する接続文字列とデータベース接続を 1 つのパラメータで受け取ります。EntityConnection コンストラクタは、既存の MetadataWorkspace オブジェクトとデータベース接続文字列を受け取ります。このコンストラクタを使用すると、ディスク上のファイル以外のソースのメタデータから、またはアセンブリの埋め込みリソースとして EntityConnection を作成するという重要なシナリオが可能になります。

EntityConnection の各インスタンスは、概念モデルとストレージ モデル、および、この 2 つのモデル間のマッピングに関するメタデータを表す MetadataWorkspace の参照を保持します。接続文字列を変更した場合、適切なメタデータを含んだ新しいメタデータ ワークスペースが作成されます。

[!メモ]

接続文字列を変更すると、異なるメタデータ ワークスペース インスタンスが作成されます。これは、メタデータ キャッシュが成果物パス、プロバイダ名、およびプロバイダ接続文字列に関連付けられているためです。プロバイダ接続文字列を変更すると、キャッシュ エントリも変更されます。

MetadataWorkspace クラスのインスタンスは、EntityConnection クラスのインスタンスから取得するか、特殊化されたバージョンの ObjectContext クラスのインスタンスから取得できます。ObjectContext クラスは、ADO.NET とデータベース間の接続をカプセル化し、作成、読み取り、更新、削除など、各種の操作のゲートウェイとして機能します。ADO.NET エンティティ フレームワーク を使用してアプリケーションを構築する場合、ObjectContext から派生したクラスが エンティティ フレームワーク によって自動的に生成されます。

次のコード サンプルは、MetadataWorkspace オブジェクトを取得する 2 とおりの方法を示しています。1 つ目のコード例では、MetadataWorkspace クラスのインスタンスを EntityConnection クラスのインスタンスから明示的に取得します。2 つ目のコード例では、MetadataWorkspace クラスのインスタンスを、特殊化されたバージョンの ObjectContext クラスから暗黙的に取得します。このコード サンプルでは、「AdventureWorks Complete Model (EDM)」で説明されている AdventureWorks モデルを使用します。アプリケーション構成ファイルの例については、「AdventureWorks オブジェクト モデルの使用 (EDM)」を参照してください。

using System;
using System.Data;
using System.Data.Objects;
using System.Collections.ObjectModel;
using System.Data.EntityClient;
using System.Data.Metadata.Edm;
using AdventureWorksModel;

class MetadataWorkspaceExample
{
  static void Main()
  {
    try
    {
       // Retrieve a MetadataWorkspace from the EntityConnection:
       // The input parameter for an EntityConnection is a 
       // connection string that refers to the location of the 
       // XML files containing the persistent representation of 
       // metadata.
       // Establish a connection to the underlying data provider by
       // using the connection string specified in the config file.
       using (EntityConnection connection = 
             new EntityConnection("Name=AdventureWorksEntities"))
       {
          // Get the metadata workspace from the connection.
          MetadataWorkspace workspace = 
                     connection.GetMetadataWorkspace();

          // Get a collection of the entity containers.
          ReadOnlyCollection<EntityContainer> containers = 
                   workspace.GetItems<EntityContainer>(
                                      DataSpace.CSpace);

          // Iterate through the collection to get 
          // each entity container.
          foreach (EntityContainer container in containers)
          {
              Console.WriteLine("EntityContainer Name: {0} ", 
                               container.Name);
          }
       }
     }
     catch (MetadataException exceptionMetadata)
     {
        Console.WriteLine("MetadataException: {0}", 
                         exceptionMetadata.Message);
     }
     catch (System.Data.MappingException exceptionMapping)
     {
        Console.WriteLine("MappingException: {0}",
                         exceptionMapping.Message);
     }

     try
     {
        // Retrieve a MetadataWorkspace from an ObjectContext:
        // AdventureworksContext 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;

           // Get a collection of the entity containers.
           ReadOnlyCollection<EntityContainer> containers = 
                    workspace.GetItems<EntityContainer>(
                                    DataSpace.CSpace);

           // Iterate through the collection to get 
           // each entity container.
           foreach (EntityContainer container in containers)
           {
               Console.WriteLine(
                    "EntityContainer Name: {0} ", 
                    container.Name);
            }
        }
     }
     catch (MetadataException exceptionMetadata)
     {
        Console.WriteLine("MetadataException: {0}", 
                         exceptionMetadata.Message);
     }
     catch (System.Data.MappingException exceptionMapping)
     {
        Console.WriteLine("MappingException: {0}",
                         exceptionMapping.Message);
     }
  }
}
Imports System
Imports System.Data
Imports System.Collections.ObjectModel
Imports System.Data.EntityClient
Imports System.Data.Metadata.Edm
Imports AdventureWorksModel

Class MetadataWorkspaceExample

  Public Shared Sub Main()
   Try
     ' Retrieve a MetadataWorkspace from the EntityConnection:
     ' The input parameter for an EntityConnection is a 
     ' connection string that refers to the location of the 
     ' XML files containing the persistent representation of 
     ' metadata.
     ' Establish a connection to the underlying data provider by
     ' using the connection string specified in the config file.
     Using connection As EntityConnection = _
        New EntityConnection("Name=AdventureWorksEntities")

        ' Get the metadata workspace from the connection.
        Dim workspace As MetadataWorkspace = _
           connection.GetMetadataWorkspace()

        ' Get a collection of the entity containers.
        Dim containers As ReadOnlyCollection(Of EntityContainer)
        containers = _
           workspace.GetItems(Of EntityContainer)(DataSpace.CSpace)

        ' Iterate through the collection to get 
        ' each entity container.
        Dim container As EntityContainer
        For Each container In containers
          Console.WriteLine("EntityContainer Name: {0} ", _
              container.Name)
        Next
     End Using
   Catch exceptionMetadata As MetadataException
     Console.WriteLine("MetadataException: {0}", _
        exceptionMetadata.Message)
   Catch exceptionMapping As MappingException
     Console.WriteLine("MappingException: {0}", _
          exceptionMapping.Message)
   End Try

   Try
     ' Retrieve a MetadataWorkspace from an ObjectContext:
    ' AdventureworksContext 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

      ' Get a collection of the entity containers.
      Dim containers As ReadOnlyCollection(Of EntityContainer)
      containers = _
         workspace.GetItems(Of EntityContainer)(DataSpace.CSpace)

      ' Iterate through the collection to get 
      ' each entity container.
      Dim container As EntityContainer
      For Each container In containers
        Console.WriteLine("EntityContainer Name: {0} ", container.Name)
      Next
    End Using
     Catch exceptionMetadata As MetadataException
       Console.WriteLine("MetadataException: {0}", _
           exceptionMetadata.Message)
     Catch exceptionMapping As MappingException
        Console.WriteLine("MappingException: {0}", _
           exceptionMapping.Message)
     End Try
  End Sub
End Class

参照

概念

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