Соединение сущности и рабочая область метаданных
При разработке приложения, работающего с платформой ADO.NET Entity Framework, для соединения с базой данных можно использовать объект EntityConnection. При создании нового экземпляра класса EntityConnection в модели Entity Data Model EDM в файле app.config можно указать строку соединения. Она ссылается на набор метаданных, содержащий необходимые модели и сопоставления, а также имя конкретного поставщика данных и строку соединения.
Конструкторы для объектов EntityConnection включают методы EntityConnection и EntityConnection. Метод EntityConnection принимает строку соединения, ссылающуюся на метаданные и соединение с базой данных в одном параметре. Конструктор метода EntityConnection принимает существующий объект MetadataWorkspace и строку соединения с базой данных. Это позволяет ключевому сценарию создавать объекты EntityConnection на основе метаданных из источника, отличного от файла на диске или ресурса, внедренного в сборку.
Каждый экземпляр EntityConnection содержит ссылку на пространство имен MetadataWorkspace, описывающее метаданные концептуальной модели и модели хранения, а также их сопоставление. При изменении строки соединения создается новая рабочая область метаданных, содержащая соответствующие метаданные.
![]() |
---|
Любое изменение строки соединения создает другой экземпляр рабочей области метаданных, так как кэш метаданных является ключом к путям артефактов, имени поставщика и строке соединения поставщика. Если строка соединения поставщика отличается, элементы кэша будут другими. |
Экземпляр класса MetadataWorkspace можно получить из экземпляра класса EntityConnection или специальной версии класса ObjectContext. Класс ObjectContext инкапсулирует соединение между платформой ADO.NET и базой данных, выполняя функцию шлюза для операций создания, чтения, обновления и удаления. При построении приложения с помощью платформы ADO.NET Entity Framework она автоматически формирует класс, производный от класса ObjectContext.
В следующем образце кода показаны два способа получения объекта MetadataWorkspace. В первом образце кода из экземпляра класса EntityConnection явно извлекается экземпляр класса MetadataWorkspace. Во втором образце кода из специализированного экземпляра класса ObjectContext экземпляр класса MetadataWorkspace извлекается неявно. В этих образцах кода используется модель AdventureWorks, представленная в разделе Полная модель AdventureWorks (модель EDM). Пример файла конфигурации приложения см. в разделе Использование модели объектов 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