Связи (метаданные)
Связи в модели Entity Data Model EDM определяют связь двух сущностей. В разделе Связи в модели EDM представлены подробные сведения о связях в модели EDM.
В метаданных ADO.NET для представления связей между сущностями EntityType предоставляется тип AssociationType. Тип AssociationType является производным от типа RelationshipType и представляет ассоциацию модели EDM. Аналогично тип AssociationSet описывает сущности EntitySet, участвующие в конкретной ассоциации модели EDM. Дополнительные сведения о наборах сущностей и ассоциаций см. в разделах Наборы сущностей (модель EDM) и Наборы ассоциаций (модель EDM).
В следующем образце кода показано, как получить рабочее пространство метаданных из соединения и использовать его для получения сведений о связях в заданной модели. Обратите внимание, что рабочая область метаданных — это служебный компонент времени выполнения, который обеспечивает поддержку извлечения метаданных.
В образце кода для указания модели используется элемент CSpace. Элемент CSpace представляет собой имя по умолчанию для концептуальной модели.
Этот образец кода содержит три метода: GetAssociations, GetAssociationSets и GetOneAssociationSet.
Метод GetAssociations получает коллекцию ассоциаций и перебирает ее, чтобы получить доступ к элементам ассоциаций End.
Метод GetAssociationSets получает коллекцию контейнеров сущностей и перебирает ее, чтобы получить все наборы ассоциаций в заданном контейнере. В модели EDM объект EntityContainer представляет логическое группирование наборов сущностей и наборов ассоциаций. Дополнительные сведения об определении контейнеров сущностей в модели EDM см. в разделе Контейнеры сущностей (модель EDM).
Метод GetOneAssociationSet получает коллекцию контейнеров сущностей и перебирает ее, чтобы получить только один набор ассоциаций по заданному имени.
В следующем образце кода используется модель AdventureWorks, приведенная в разделе Полная модель AdventureWorks (модель EDM). Пример файла конфигурации приложения см. в разделе Использование модели объектов 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