エンティティ データ モデル (EDM) では、リレーションシップによって 2 つのエンティティ間の関係が定義されます。EDM のリレーションシップについては、「Entity Data Model のリレーションシップ」トピックで詳しく説明しています。
ADO.NET のメタデータは、EntityType 間のリレーションシップを表す AssociationType を提供します。AssociationType は、EDM アソシエーションを表し、RelationshipType から派生します。同様に、AssociationSet は、特定の EDM アソシエーションに参加する EntitySet を定義します。エンティティ セットとアソシエーション セットの詳細については、「エンティティ セット (EDM)」および「アソシエーション セット (EDM)」を参照してください。
次のコード サンプルでは、接続からメタデータ ワークスペースを取得した後、そのメタデータ ワークスペースを使用して、指定されたモデルのリレーションシップに関する情報を取得します。メタデータ ワークスペースは、メタデータの取得をサポートするランタイム サービス コンポーネントです。
このコード サンプルでは、CSpace を使用してモデルを指定します。CSpace は、概念モデルの既定の名前を表します。
コード サンプルには、GetAssociations、GetAssociationSets、GetOneAssociationSet の 3 つのメソッドが使用されています。
GetAssociations メソッドでは、アソシエーションのコレクションを取得した後、そのコレクションを反復処理しながら、各アソシエーションの End メンバにアクセスします。
GetAssociationSets メソッドは、エンティティ コンテナのコレクションを取得した後、そのコレクションを反復処理しながら、指定されたコンテナの各アソシエーション セットを取得します。EDM では、エンティティ セットとアソシエーション セットの論理的なグループが、EntityContainer によって表されます。EDM におけるエンティティ コンテナの定義方法の詳細については、「エンティティ コンテナ (EDM)」を参照してください。
GetOneAssociationSet メソッドは、エンティティ コンテナのコレクションを取得した後、そのコレクションを反復処理しながら、指定された名前を使って単一のアソシエーション セットを取得します。
次のコード サンプルでは、「AdventureWorks Complete Model (EDM)」トピックで使用されている Adventureworks モデルを使用します。アプリケーション構成ファイルの例については、「AdventureWorks オブジェクト モデルの使用 (EDM)」を参照してください。
using System;
using System.Data;
using System.Data.EntityClient;
using System.Data.Metadata.Edm;
using System.Collections.ObjectModel;
class GetRelationshipsExample
{
static void Main()
{
try
{
// 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"))
{
// Open the connection.
connection.Open();
// Access the metadata workspace.
MetadataWorkspace workspace =
connection.GetMetadataWorkspace();
// Get associations from the conceptual model.
GetAssociations(workspace, DataSpace.CSpace);
// Get association sets from the conceptual model.
GetAssociationSets(workspace, DataSpace.CSpace);
// Get one assoiation set by using the specified
// relationship name from the conceptual model.
string relationshipName = "FK_Employee_Contact_ContactID";
GetOneAssociationSet(
workspace, relationshipName, DataSpace.CSpace);
}
}
catch (MetadataException exceptionMetadata)
{
Console.WriteLine("MetadataException: {0}",
exceptionMetadata.Message);
}
catch (System.Data.MappingException exceptionMapping)
{
Console.WriteLine("MappingException: {0}",
exceptionMapping.Message);
}
}
public static void GetAssociations(
MetadataWorkspace workspace, DataSpace model)
{
Console.WriteLine("***Get Associations =>");
// Get a collection of association types.
ReadOnlyCollection<AssociationType> associationTypes =
workspace.GetItems<AssociationType>(model);
// Iterate through the collection to get each association type.
foreach (AssociationType associationType in associationTypes)
{
Console.WriteLine("AssociationType Name: {0}, Namespace: {1}",
associationType.Name,
associationType.NamespaceName);
// Iterate through the collection to get
// each association end member.
foreach (AssociationEndMember end in
associationType.AssociationEndMembers)
{
Console.WriteLine(
"\t End Name: {0}, Type: {1}, Multiplicity: {2}",
end.Name,
end.TypeUsage.EdmType.Name,
end.RelationshipMultiplicity);
}
}
}
public static void GetAssociationSets(
MetadataWorkspace workspace, DataSpace model)
{
Console.WriteLine("***Get Association Sets =>");
// Get a collection of entity containers.
ReadOnlyCollection<EntityContainer> containers =
workspace.GetItems<EntityContainer>(model);
// Iterate through the collection to get each entity container.
foreach (EntityContainer container in containers)
{
// Iterate through the collection to get each entity set base.
foreach (EntitySetBase baseSet in container.BaseEntitySets)
{
// EntitySetBase is a super type for
// AssociationSet and EntitySet.
// Check if the current object is an instance of the
// AssociationSet.
if (baseSet is AssociationSet)
{
Console.WriteLine(
"AssociationSet Name: {0} , " +
"AssociationType Name: {1} ",
baseSet.Name, baseSet.ElementType.FullName);
AssociationSet associationSet =
baseSet as AssociationSet;
// Iterate through the collection to get
// each association end.
foreach (AssociationSetEnd end in
associationSet.AssociationSetEnds)
{
Console.WriteLine(
"EntitySet Name: {0} , Name: {1}, " +
"AssociationEndMember: {2} ",
end.EntitySet,
end.Name,
end.CorrespondingAssociationEndMember);
}
}
}
}
}
public static void GetOneAssociationSet(
MetadataWorkspace workspace, string relationshipName,
DataSpace model)
{
Console.WriteLine("***Get One AssociationSet =>");
// Get a collection of entity containers.
ReadOnlyCollection<EntityContainer> containers =
workspace.GetItems<EntityContainer>(model);
// Iterate through the collection to get each entity container.
foreach (EntityContainer container in containers)
{
RelationshipSet relationshipSet;
// Check if the relationship with the specified name exists
// or not.
if (container.TryGetRelationshipSetByName(
relationshipName, true, out relationshipSet))
{
AssociationSet associationSet =
relationshipSet as AssociationSet;
Console.WriteLine(
"AssociationSet Name: {0} , " +
"AssociationType Name: {1} ",
associationSet.Name,
associationSet.ElementType.FullName);
}
}
}
}
Imports System
Imports System.Collections.ObjectModel
Imports System.Data
Imports System.Data.EntityClient
Imports System.Data.Metadata.Edm
Class GetRelationshipsExample
Shared Sub Main()
Try
' 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")
' Open the conection.
connection.Open()
' Access the metadata workspace.
Dim workspace As MetadataWorkspace = _
connection.GetMetadataWorkspace
' Get associations from the conceptual model.
GetAssociations(workspace, DataSpace.CSpace)
' Get association sets from the conceptual model.
GetAssociationSets(workspace, DataSpace.CSpace)
' Get one assoiation set by using the specified
' relationship name from the conceptual model.
Dim relationshipName As String = _
"FK_Employee_Contact_ContactID"
GetOneAssociationSet( _
workspace, relationshipName, DataSpace.CSpace)
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
Public Shared Sub GetAssociations( _
ByVal workspace As MetadataWorkspace, ByVal model As DataSpace)
Console.WriteLine("***Get Associations =>")
' Get a collection of association types.
Dim associationTypes As ReadOnlyCollection(Of AssociationType) = _
workspace.GetItems(Of AssociationType)(model)
' Iterate through the collection to get each association type.
Dim associationType As AssociationType
For Each associationType In associationTypes
Console.WriteLine("AssociationType Name: {0}, Namespace: {1}", _
associationType.Name, associationType.NamespaceName)
' Iterate through the collection to get
' each association end member.
Dim endMember As AssociationEndMember
For Each endMember In associationType.AssociationEndMembers
Console.WriteLine(ControlChars.Tab & _
" End Name: {0}, Type: {1}, Multiplicity: {2}", _
endMember.Name, endMember.TypeUsage.EdmType.Name, _
endMember.RelationshipMultiplicity)
Next
Next
End Sub
Public Shared Sub GetAssociationSets( _
ByVal workspace As MetadataWorkspace, ByVal model As DataSpace)
Console.WriteLine("***Get Association Sets =>")
' Get a collection of entity containers.
Dim containers As ReadOnlyCollection(Of EntityContainer) = _
workspace.GetItems(Of EntityContainer)(model)
Dim container As EntityContainer
' Iterate through the collection to get each entity container.
For Each container In containers
Dim baseSet As EntitySetBase
' Iterate through the collection to get each entity set base.
For Each baseSet In container.BaseEntitySets
' EntitySetBase is a super type for
' AssociationSet and EntitySet.
' Check if the current object is an instance of the
' AssociationSet.
If TypeOf baseSet Is AssociationSet Then
Console.WriteLine( _
"AssociationSet Name: {0} , AssociationType Name: {1} ", _
baseSet.Name, baseSet.ElementType.FullName)
Dim associationSet As AssociationSet = _
TryCast(baseSet, AssociationSet)
Dim end1 As AssociationSetEnd
' Iterate through the collection to get
' each association end.
For Each end1 In associationSet.AssociationSetEnds
Console.WriteLine( _
"EntitySet Name: {0} , Name: {1}, AssociationEndMember: {2} ", _
end1.EntitySet, end1.Name, _
end1.CorrespondingAssociationEndMember)
Next
End If
Next
Next
End Sub
Public Shared Sub GetOneAssociationSet( _
ByVal workspace As MetadataWorkspace, _
ByVal relationshipName As String, _
ByVal model As DataSpace)
Console.WriteLine("***Get One AssociationSet =>")
' Get a collection of entity containers.
Dim containers As ReadOnlyCollection(Of EntityContainer) = _
workspace.GetItems(Of EntityContainer)(model)
Dim container As EntityContainer
' Iterate through the collection to get each entity container.
For Each container In containers
Dim relationshipSet As RelationshipSet
relationshipSet = Nothing
' Check if the relationship with the specified name exists
' or not.
If container.TryGetRelationshipSetByName( _
relationshipName, True, relationshipSet) Then
Dim associationSet As AssociationSet = _
TryCast(relationshipSet, AssociationSet)
Console.WriteLine( _
"AssociationSet Name: {0} , AssociationType Name: {1} ", _
associationSet.Name, associationSet.ElementType.FullName)
End If
Next
End Sub
End Class