Conexión de entidades y área de trabajo de metadatos
Al desarrollar una aplicación que usa ADO.NET Entity Framework, se puede usar un objeto EntityConnection para conectarse a una base de datos. Cuando se crea una instancia nueva de la clase EntityConnection en el Entity Data Model (EDM), se puede especificar una cadena de conexión en un archivo app.config. La cadena de conexión hace referencia a un conjunto de metadatos que contiene la asignación y los modelos necesarios, y también el nombre de un proveedor de datos específico del almacenamiento y una cadena de conexión.
Los constructores para EntityConnection incluyen EntityConnection y EntityConnection. EntityConnection toma una cadena de conexión que hace referencia a los metadatos y una conexión a bases de datos en un parámetro único. El constructor EntityConnection toma un objeto MetadataWorkspace existente y una cadena de conexión a bases de datos. De esta forma se habilita un escenario clave en el que se crea una EntityConnection basada en los metadatos de un origen diferente a un archivo en un disco o como un recurso incrustado en un ensamblado.
Cada instancia de EntityConnection contiene una referencia al MetadataWorkspace que describe los metadatos acerca de los modelos conceptual y de almacenamiento, y la asignación entre ambos. Cuando se cambia la cadena de conexión, se crea una nueva área de trabajo de metadatos que contiene los metadatos apropiados.
Nota |
---|
Cualquier cambio en una cadena de conexión crea una instancia diferente del área de trabajo de los metadatos porque la memoria caché de metadatos se incluye en las rutas de acceso de artefactos, el nombre del proveedor y la cadena de conexión del proveedor. Si la cadena de conexión del proveedor es diferente, las entradas de la memoria caché serán distintas. |
Se puede recuperar una instancia de la clase MetadataWorkspace a partir de una instancia de la clase EntityConnection o una versión especializada de la clase ObjectContext. La clase ObjectContext encapsula una conexión entre ADO.NET y la base de datos, que actúa como una puerta de enlace para las operaciones de creación, lectura, actualización y eliminación. Al generar una aplicación con ADO.NET Entity Framework, Entity Framework genera automáticamente una clase derivada de ObjectContext.
En el siguiente ejemplo de código se muestran dos modos de recuperar un objeto MetadataWorkspace. En el primer ejemplo de código se recupera una instancia de la clase MetadataWorkspace a partir de la instancia de la clase EntityConnection de forma explícita. En el segundo ejemplo de código se recupera una instancia de la clase MetadataWorkspace a partir de una versión especializada de la clase ObjectContext de forma implícita. El ejemplo de código usa el modelo de Adventureworks que se describe en Modelo completo (EDM) de AdventureWorks. Para obtener un ejemplo del archivo de configuración de la aplicación, vea Usar el modelo de objetos de 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