Uno de las características que más me gusta el Entity Framework es la abstracción del motor de base de datos y que nos permite crear aplicaciones sin atarnos a un motor especifico, pudiendo (teniendo en cuenta ciertas limitaciones) que la misma aplicación funcione sobre distintos motores de bases de datos.
Para el ejemplo vamos a seguir el enfoque "model first", es decir primero crearemos el modelo la herramienta de visual studio y luego generaremos las instrucciones DDL para crear la base de datos en SQLSERVER.
Creamos un proyecto de Visual estudio nuevo como aplicación de consola. Yo uso Visual Studio 2012 premium y compilando la aplicación para el .Net Framework 4. Pulsamos botón derecho sobre el proyecto, y Agregar nuevo modelo. Seleccionamos ADO.NET Entity data model y seleccionamos la opción Empty Model ya que vamos a usar el enfoque "model first".
Una vez creemos el modelo como en la imagen, vamos a generar el código DDL para SQLServer 2008. Deberemos tener instalados los conectores apropiados, yo uso los de Devart (podéis descargarlos aquí Hay que tener en cuenta a la hora de crear el modelo las limitaciones de tipos de datos que tengan cada motor.
Para ello pulsamos botón derecho y en propiedades vemos que tenemos seleccionada en DDL Generation Template la de SQLServer (SSDLToSQL10.tt), y luego botón derecho de nuevo en el modelo y le damos a Generate database from model y seguimos el asistente. repetiremos este proceso para los tres motores, cambiando en las propiedades del modelo la template DDL que queremos usar, de esta forma conseguimos los script de las bases de datos para los motores que queramos, en mi caso: SQLServer, MySQL, y SQLite.
Ahora vamos a crear los ficheros ssdl que mapean cada motor de base de datos, para ello agregamos un nuevo elemento al proyecto de tipo XML y lo llamamos por ejemplo "modeloMySQL.ssdl" y le activamos la propiedad de copiar siempre al directorio de destino. hacemos lo mismo con los distintos motores de bases de datos.
Hacemos botón derecho sobre el modelo (el .edmx) y le damos a "abrir con" y seleccionamos Editor XML(texto), tenemos que copiar el nodo completo que se llama "Schema" y pegarlo en los .ssdl que creamos en el paso anterior. Por ultimo buscamos el atributo provider del nodo Schema y cambiamos su valor por el provider necesario. Los atributos Schema de los nodos EntitySet los dejaremos vacíos para MySQL y SQLite.
<Schema Namespace="ModeloSQLServer.Store" Alias="Self" Provider="Devart.Data.MySql" ProviderManifestTok ...Por ultimo para terminar de configurar las conexiones, creamos las cadenas de conexión en el app.config de la siguiente manera:
01 <connectionStrings> 02 <add name="ModeloSQLServerContainer" 03 04 connectionString="metadata=res://*/ModeloSQLServer.csdl|res://*/ModeloSQLServer.ssdl|res://*/ModeloSQLServer.msl;provider=System.Data.SqlClient;provider connection string="data source=pc-matos\sqlexpress;initial catalog=ejEFmultiDB;persist security info=True;user id=matos;password=blabla;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" /> 05 <add name="ModeloMySQLContainer" 06 07 connectionString="metadata=res://*/ModeloSQLServer.csdl|ModeloMySQL.ssdl|res://*/ModeloSQLServer.msl;provider=Devart.Data.MySql;provider connection string="user id=root;host=localhost;database=ejEFmultiDB;persist security info=True"" providerName="System.Data.EntityClient" /> 08 09 <add name="ModeloSQLiteContainer" 10 11 connectionString="metadata=res://*/ModeloSQLServer.csdl|ModeloSQLite.ssdl|res://*/ModeloSQLServer.msl;provider=Devart.Data.SQLite;provider connection string="data source=C:\SQLite\ejEFmultiDB.db"" providerName="System.Data.EntityClient" /> 12 13 </connectionStrings>Vamos a empezar a escribir código y lo primero que haremos es incluir el ensamblado System.Configuration a las referencias y pondremos su respectivo using.
Para crear el contexto en función de la conexión a cada motor de base de datos, lo hacemos de la siguiente forma:
01 string conexionMySql = ConfigurationManager.ConnectionStrings["ModeloMySQLContainer"].ConnectionString; 02 using (ModeloSQLServerContainer context = new ModeloSQLServerContainer(conexionMySql)) 03 { 04 //bloque de código que queramos realizar. 05 }El ejemplo completo, se puede descargar desde aquí.
No hay comentarios:
Publicar un comentario