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