[Entity Framework] Conexion con multiples proveedores en un mismo Edmx

Hola, una de las características por las que siempre veo preguntas en los foros es con respecto a si Entity Framework permite la conexión con distintos proveedores de base de datos, por ejemplo, tener una aplicación que por defecto se conecta a una base de datos en SQL Server y tener la opción de conectarla con una MySQL, la respuesta a este interrogante es SI :D.

En el siguiente ejemplo trabajare con una base de datos en SQL Server que tiene las tablas Pais y Ciudad.

Creamos un nuevo proyecto en Visual Studio, en mi caso sera uno del tipo Aplicación de Consola, sobre este proyecto agregaremos un modelo de Entity Framework y nos conectaremos a nuestra base de datos hecha en SQL Server.

Una vez hecho esto, como de costumbre se habrá generado un archivo de configuración que contiene el ConnectionString que usara el modelo conceptual de EF, si analizamos este archivo veremos tres cosas relevantes:

Como se puede ver tenemos [y como ya lo hemos hablado en esta serie de post] se define la metadata, donde se define la localización de los tres archivos que componen nuestro EDMX, ademas se define el Provider especifico para esta conexión y finalmente la cadena de conexión a el almacén de datos físico.

Intuitivamente lo que necesitaríamos para conectarnos con la base de datos en MySQL seria simplemente escribir un ConnectionString para esta y pasarlo como parámetro en el constructor del contexto. Pero si hacemos esto recibiremos una excepción informándonos que no se puede convertir el resultado de MySQLClient a uno de SQLClient, pero ¿por que?…. la respuesta esta en la estructura de los archivos XML que maneja Entity Framework para construir el EDMX.

Si revisamos el post de introducción de esta serie veremos que allí se nombran estos tres archivos y se explica que el archivo .ssdl (Storage Schema Definition Language) es el encargado de describir la estructura física de la base de datos, incluyendo la definición de las tablas, las vistas, SP’s y relaciones.

Teniendo esto clara la teoría solo falta verlo en acción, para ver el XML de un archivo EDMX, basta con hacer click contrario en el archivo, hacer click en la opción Open With y seleccionar XML (Text) Editor. Si revisamos el XML generado desde la sección del comentario SSDL Content nos daremos cuenta de lo que trata este XML. Como vemos en el elemento Schema se define:

Provider=”System.Data.SqlClient” ProviderManifestToken=”2008″

Es por esto que por mas que cambiemos el conecctionstring obtendremos una excepción.

La solución a esto, simple, escribir nuestro propio .ssdl que contenga la definición para MySQL, lo que debemos hacer es agregar un nuevo archivo de xml con el nombre ModeloMySql.ssdl y copiar y pegar el contenido que esta definido desde el comentario SSDL Content, eliminamos la etiqueta edmx:StorageModels. Una vez hecho esto redefiniremos los valores de las propiedades : Provider, ProviderManifestToken y Schema [este ultimo en MySQL toma como valor el nombre de la base de datos]. Nuestro archivo quedaría así:

Namespace="EFDemoModel.Store" Alias="Self" Provider="MySql.Data.MySqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">

Una vez hecho esto deberemos crear el connectiostring que se conecte a la base de datos MySQL yque ademas use nuestro archivo .SSDL, así:

name="efdemomysqlEntities"
         connectionString="metadata=ModeloMySql.ssdl|res://*/Modelo.csdl|res://*/Modelo.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;User Id=root;password=root;database=efdemomysql""
         providerName="System.Data.EntityClient" />

Notese que no le he dado ningun carácter de escape para la localización del archivo, esto se debe a que en las propiedades del archivo en la propiedad copiar en el directorio de resultados le asigne SIEMPRE. mas información sobre las propiedades de archivos aquí.

Una vez hecho esto solo nos resta probar su funcionamiento, del lado del código de nuestra interfaz de usuario he hecho lo siguiente:

string conexionMySql = ConfigurationManager.ConnectionStrings["efdemomysqlEntities"].ConnectionString;
 using (EFDemoEntities context = new EFDemoEntities())
 {
                List paisesLatinos = (from p in context.Pais
                                     select p).ToList();
  }
  using (EFDemoEntities context = new EFDemoEntities(conexionMySql))
  {
                List paisesEuropeos = (from p in context.Pais
                                     select p).ToList();
   }

Ejecutamos y veremos los resultados.

Como vemos es una gran ventaja esta que nos ofrece esta ORM, pues ya no es necesario casarse con el gestor de base de datos en cuestión si no que se puede migrar en cualquier momento. [Aunque esta es la hora que no he visto un solo cliente pedir algo así].

NOTA: Para conectar Entity Framework 4.0 con MySQL se debe usar el conector 6.3.5, que se encuentra en este enlace, lo instalas y el mismo te configura el Visual Studio 2010 para tomar esta tipo de conexiones.

Espero les sea de utilidad.

Descarga el ejemplo.

Hasta el próximo post.

Anuncios
[Entity Framework] Conexion con multiples proveedores en un mismo Edmx

Un comentario en “[Entity Framework] Conexion con multiples proveedores en un mismo Edmx

  1. Arturo dijo:

    Muchas gracias por este ejemplo. Pude utilizarlo bien, sin embargo, a la hora de tener un DataModel como una librería aparte de mi proyecto (donde tengo el .ssdl para MySql) me dice que no se puede cargar los archivos de metadatos especificados. Supongo que es por la ruta que le estoy dando en el app.config, pero aún no encuentro la manera de que carge el archivo si está en otra librería.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s