28

Cambié mi DAL de usar LINQ a Entity Framework. Debido a que mi aplicación se conecta a diferentes bases de datos dependiendo del usuario actual, necesito crear dinámicamente el DataContext en tiempo de ejecución y pasar la cadena de conexión apropiada. Sin embargo, cuando intenté crear programáticamente una conexión de Entity Framework utilizando mi cadena de conexión anterior, la conexión falló. Se quejó de que no reconoció la clave en la cadena de conexión, "servidor" para ser exactos.¿Por qué una conexión de Entity Framework requiere una propiedad de metadatos?

descubrí que necesitaba hacer esto con el fin de obtener la conexión de Entity Framework para trabajar:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
entityBuilder.Provider = "System.Data.SqlClient"; 
entityBuilder.ProviderConnectionString = clientConnectionString; 
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl..."; 
Entities entities = new Entities(entityBuilder.ToString()); 

¿Por qué es esto?
¿Para qué sirve la propiedad Metadata?
¿Va a ser un problema que siempre sea el mismo para múltiples conexiones diferentes?
¿Cuál debería ser?
¿Hay alguna forma de evitar esto?

¡Gracias de antemano!

Actualización 1: Gracias por la actualización Randolpho, pero ...
La razón por la que estoy teniendo este problema, es que no puedo almacenar las cadenas de conexión en un archivo de configuración. La cadena de conexión se determina dinámicamente en tiempo de ejecución mediante la cual el usuario se conecta.

Aquí es mi escenario exacto:
Si el usuario A se conecta, la aplicación extrae datos de la base de datos A. Si el usuario B está conectando, la aplicación extrae datos de la base de datos B.
Las cadenas de conexión se almacenan en un principal base de datos, y el número es potencialmente ilimitado. Cada vez que agrego un usuario, no quiero tener que ingresar al web.config, ¡sin mencionar el hecho de que eventualmente se volverá ENORME!

+0

Dado que las asignaciones son las mismas para cada conexión, y no cambiará, no debería importar que use los mismos metadatos para todas, ¿verdad? –

+0

sí, es correcto – user230910

Respuesta

9

Encontrará estos enlaces muy informativos:

http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.connectionstring.aspx

http://weblogs.asp.net/pgielens/archive/2006/08/21/ADO.NET-Entity-Framework-Metadata.aspx

En pocas palabras? Entity Framework necesita los metadatos para construir las asignaciones de su entidad.

Además, debe considerar trasladar la información de conexión a su archivo de configuración en lugar de compilarlo en código. El primer enlace le mostrará cómo hacerlo.

+2

@ocdecio: No descarte EF solo por eso; NHibernate funciona más o menos de la misma manera. Sin embargo, estoy seguro de que hay otras razones. :) – Randolpho

+2

@ocdecio, me encantaría ver un mapeador ORM que no utilice algún tipo de archivo de mapeo. A menos que hagas 1: 1 con tablas, algo tiene que decirle algo a todo. – jfar

24

Ampliando la respuesta de Randolpho:

La propiedad de metadatos apunta específicamente a la ubicación de la .SSDL (Modelo de almacenamiento,) archivos .CSDL (Modelo Conceptual, .MSL) y (correspondencia de modelos). Estos tres archivos son esencialmente el Modelo de datos de la entidad. El calificador de estilo URI "res: //" indica que los archivos están integrados como recursos en el ensamblado EDM compilado.

Cuestiones relacionadas