Recuperando una cadena de conexion SqlConnectionString desde una cadena EntityConnectionString

Desde hace algunos proyectos, en lugar de usar frameworks o librerías de acceso a datos para un escenario Ado.Net y SQL Server, prefiero usar Ado.Net Entity Framework. Partiendo de las premisas que se cuenta con Visual Studio 2008, son proyectos nuevos, y claro, siempre y cuando pueda intervenir en decidir la arquitectura de la aplicación.

Si estamos empezando a usar una nueva tecnología, tomemos como referencia el acceso a datos que siempre podemos usar frameworks, apis, generadores de código, o un ORM, como decía si, estamos empezando a usar una nueva tecnología para el acceso a datos, no debemos ser estrictos en el uso, sobre todo si no tenemos la experiencia necesario o no tenemos información disponible, bajo la premisa que no podemos retrasar los tiempos del proyecto. Si en un proyecto estoy usando Ado.Net EF o NHibernate, y tengo problemas para traducir alguna consulta, no debemos obsesionarnos en hacerlo con la tecnología usada, si en un par de días no encontramos alguna solución, podemos hacer ese método o consulta compleja con ado.net puro (SqlConnection, etc). Es una opinión personal, y bajo la premisa que no podemos retrasar los tiempos del proyecto por intentar ser puristas y estrictos en el uso de algunas tecnologías. Ojo, esto tampoco quiere decir vayamos hacer una mezcolanza una mazamorra con nuestros proyectos y código, siempre debemos mantener la legibilidad.

Dejemos el rollo, y vayamos al tema del post:

Necesitamos crear una conexión SlqConnection en un proyecto que esta usando Ado.Net Entity Framework, pero no deseamos agregar una nueva cadena de conexión al archivo de configuración para la misma base de datos.

Una cadena de conexión para EntityClient (EntityConnection) es así:

   1: <add name="AdventureWorksEntities" 

   2:      connectionString="metadata=.AdventureWorks.csdl|.AdventureWorks.ssdl|.AdventureWorks.msl;

   3:      provider=System.Data.SqlClient;provider connection string='Data Source=localhost;

   4:      Initial Catalog=AdventureWorks;Integrated Security=True;multipleactiveresultsets=true'" 

   5:      providerName="System.Data.EntityClient" />

Pero una conexión para SqlClient (SqlConnection) puede tener la siguiente estructura:

   1: <add name="AdventureWorksSql" 

   2:      connectionString="Data Source=localhost;Initial Catalog=AdventureWorks;

   3:      Integrated Security=True;" 

   4:       providerName="System.Data.SqlClient" />

Con el siguiente código, podemos recuperar una cadena de conexión SqlClient, desde una cadena de conexión EntityClient:

   1: EntityConnectionStringBuilder entCn = new EntityConnectionStringBuilder(

   2:     ConfigurationManager.ConnectionStrings["AdventureWorksEntities"].ConnectionString);

   3:  

   4: SqlConnectionString = 

   5:       entCn.ProviderConnectionString.Replace("MultipleActiveResultSets=True","");

Y con este código evitamos la necesidad de tener dos cadenas de conexión, que apuntan a la misma base de datos pero con distinto proveedor. Evidentemente que hay un costo de operación al recuperar el valor de la otra de conexión, porque internamente debe estar haciendo un split o algo parecido. El uso dependerá del escenario, y podemos encontrar algunas variantes bajo la misma idea, como por ejemplo partir de una cadena SqlClient y convertirla en una cadena EntityClient. Pero ahí esta el código.

Nota: Sobre remover el atributo MultipleActiveResultSets, cuando creamos una cadena de conexión Sql y no indicamos este atributo por defecto es False (revisar aquí los valores por defecto en una cadena de conexión Sql). Esta opción llamada MARS, esta disponible desde Ado.Net 2.0 y permite la ejecución de varios SqlCommand sin tener que cerrar la conexión y usando la misma cadena de conexión, sólo si necesitarán usar y ejecutar varios SqlCommand en una misma conexión, se debe dejar el atributo.

Recursos Adicionales (con ejemplos):

Saludos,