none
Entity en C# RRS feed

  • Pregunta

  • Buenas,

    La pregunta es sencilla:

    ¿Cómo puedo utilizar entity en un mismo proyecto y que a su vez entity esté conectado a sql server y mysql (los dos motores tienen la misma base de datos con las mismas tablas)?

    Todo esto utilizando un mismo archivo .edmx.

    Gracias..

    jueves, 4 de octubre de 2012 21:14

Respuestas

  • Ayer por fin le llegué a la solución y como casí todo problema en programación, la solución resultó ser muy sencilla.

    Dejo los pasos para resolver este problema tomando como ejemplo el siguiente escenario:

    Existe una base de datos en SQL Server y una exactamente igual en MySQL. Se necesita que desde una misma aplicación se pueda conectar a los dos motores de Bases de Datos dependiendo de la conexión elegida al momento de ingresar al sistema. Para no tener problemas con la sintaxis de cada motor de base de datos se hace uso de LINQ y Entity Framework.

    Pasos:

    1- Añadir un elemento ADO.NET Entity Data Model al proyecto de Visual Studio y se configura para una base de datos en SQL Server.

    2- Ya creado el objeto .edmx, se hace clic derecho sobre él y se selecciona abrir con/ Editor XML(texto).

    3- Agregamos al proyecto un elemento de tipo XML y lo guardamos con extensión .ssdl (este archivo debe estar donde se encuentra el .exe de nustra aplicación).

    4- Copiamos todo lo que este dentro de la etiqueta "<Schema>" de nuestro archivo .edmx (incluyendo la etiqueta "<Schema>") y lo pegamos en nuestro archivo .ssdl recien creado.

    5- Ya en nuestro nuevo archivo .ssdl, modificamos la etiqueta "<Schema>" cambiando lo siguiente:

      * Provider="MySql.Data.MySqlClient"

    * ProviderManifestToken="2008"

    6- En el contenido de nuestro archivo .ssdl cambiamos el tipo de columna (de ser necesario), ya que los tipos de SQL Server y MySQL no son iguales.

    7- Las cadenas de conexión quedan de la siguiente manera:

    * SQL Server = "metadata=res://*/PruebaSQL_Server.csdl|res://*/PruebaSQL_Server.ssdl|res://*/PruebaSQL_Server.msl;provider=System.Data.SqlClient;provider connection string='data source=Servidor;initial catalog=BaseDatos;persist security info=True;user id=Usuario;password=Contraseña;multipleactiveresultsets=True;App=EntityFramework'"

    * MySQL = "metadata=PruebaMySQL.ssdl|res://*/PruebaSQL_Server.csdl|res://*/PruebaSQL_Server.msl;provider=MySql.Data.MySqlClient;provider connection string='server=Servidor;User Id=Usuario;password=Contraseña;port=Puerto;database=seg';"

    8- Con esto ya podemos instanciar nuestra clase que creo el Entity Framework (en el archivo .designer.cs que está dentro del archivo .edmx) y utilizar nuestra cadena de conexión.

    9- Por ultimo utilizar LINQ para realizar las consultas y listo.

    Espero le sea de utilidad a alguien más.

    Nota: Talvez exista alguna otra forma más fácil u optima para realizar esta tarea, pero está me funcionó a la perfección.

    Saludos..

    • Marcado como respuesta César CM martes, 9 de octubre de 2012 18:16
    martes, 9 de octubre de 2012 18:16

Todas las respuestas

  • en principio con solo cambiar el conection string deberias funcionar

    21.2.4.5. Tutorial: Using an Entity Framework Entity as a Windows Forms Data Source

    veras que en el connection string hay un "provider" ese es bueno definirlo segun la db que vas a usar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 5 de octubre de 2012 6:07
  • Gracias por responder.

    Investigué un poco pero hace falta configurar un nuevo archivo .ssdl para que funcione conel nuevo proveedor de datos, lo he hecho pero sigué sin funcionarme.

    viernes, 5 de octubre de 2012 14:22
  • que seria el sigue sin funcionar

    porque recuerda que en el connection string alli defines las parte del mapeo que tomeria EF

    y por lo general el ssdl esta embebido dentro de la dll, como es que lo cambias si usas una db u otra

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 5 de octubre de 2012 14:31
  • Este es el archivo que funciona bien, está para mysql.

    Este otro es el que quiero que trabeje con sql server, lo modifiqué para cambiar el proveedor de datos

    Las cadena de conexión de mysql y que trabaja perfecta es:

    "metadata=res://*/CNXMYSQL.csdl|res://*/CNXMYSQL.ssdl|res://*/CNXMYSQL.msl;provider=MySql.Data.MySqlClient;provider connection string='server=localhost;User Id=myuser;password=mypass;Persist Security Info=True;port=8080;database=desarrollo'"

    La cadena de sql server es:

    "metadata=res://CNX.ssdl|res://*/CNX.csdl|res://*/CNX.msl;provider=System.Data.SqlClient;provider connection string='data source=CcastroLT;initial catalog=desarrollo;user id=myuser;password=mypass'"

    ya probé dejando en la cadena de sql server los archivos CNXMYSQL.csdl y CNXMYSQL.msl, pero nada.

    El error que me da es: "No se pudo resolver el ensamblado CNX.ssdl".

    Me imagino que es algo malo en el archivo, sólo que no logro ver que es.

    viernes, 5 de octubre de 2012 15:02
  • el tema es que si usas

    metadata=res://CNX.ssdl|res://*/CNX.csdl|res://*/CNX.msl

    ese res que ves alli es poprque se trata de un recurso embebido que definen cada modelo, o sea alli tienes dos modelos diferentes

    deberias hacer que el csdl deje de estar como recurso, para lo cual se deberia desarmar el edmx

    Entity framework - create the csdl, ssdl and msl files

    o sea tener el .csdl como archivo xml

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 5 de octubre de 2012 16:00
  • Ya avancé un poco, ahora me da este error:

    El error es claro, lo que no sé es porque se dá, sí utilicé los datos de otro proyecto en el que usé mysql como proveedor por defecto.

    viernes, 5 de octubre de 2012 20:33
  • Tal vez te pueda servir la opción de tratar de replicar la base datos sql en mysql como lo explican en este link

    Saludos

    lunes, 8 de octubre de 2012 14:25
  • Ayer por fin le llegué a la solución y como casí todo problema en programación, la solución resultó ser muy sencilla.

    Dejo los pasos para resolver este problema tomando como ejemplo el siguiente escenario:

    Existe una base de datos en SQL Server y una exactamente igual en MySQL. Se necesita que desde una misma aplicación se pueda conectar a los dos motores de Bases de Datos dependiendo de la conexión elegida al momento de ingresar al sistema. Para no tener problemas con la sintaxis de cada motor de base de datos se hace uso de LINQ y Entity Framework.

    Pasos:

    1- Añadir un elemento ADO.NET Entity Data Model al proyecto de Visual Studio y se configura para una base de datos en SQL Server.

    2- Ya creado el objeto .edmx, se hace clic derecho sobre él y se selecciona abrir con/ Editor XML(texto).

    3- Agregamos al proyecto un elemento de tipo XML y lo guardamos con extensión .ssdl (este archivo debe estar donde se encuentra el .exe de nustra aplicación).

    4- Copiamos todo lo que este dentro de la etiqueta "<Schema>" de nuestro archivo .edmx (incluyendo la etiqueta "<Schema>") y lo pegamos en nuestro archivo .ssdl recien creado.

    5- Ya en nuestro nuevo archivo .ssdl, modificamos la etiqueta "<Schema>" cambiando lo siguiente:

      * Provider="MySql.Data.MySqlClient"

    * ProviderManifestToken="2008"

    6- En el contenido de nuestro archivo .ssdl cambiamos el tipo de columna (de ser necesario), ya que los tipos de SQL Server y MySQL no son iguales.

    7- Las cadenas de conexión quedan de la siguiente manera:

    * SQL Server = "metadata=res://*/PruebaSQL_Server.csdl|res://*/PruebaSQL_Server.ssdl|res://*/PruebaSQL_Server.msl;provider=System.Data.SqlClient;provider connection string='data source=Servidor;initial catalog=BaseDatos;persist security info=True;user id=Usuario;password=Contraseña;multipleactiveresultsets=True;App=EntityFramework'"

    * MySQL = "metadata=PruebaMySQL.ssdl|res://*/PruebaSQL_Server.csdl|res://*/PruebaSQL_Server.msl;provider=MySql.Data.MySqlClient;provider connection string='server=Servidor;User Id=Usuario;password=Contraseña;port=Puerto;database=seg';"

    8- Con esto ya podemos instanciar nuestra clase que creo el Entity Framework (en el archivo .designer.cs que está dentro del archivo .edmx) y utilizar nuestra cadena de conexión.

    9- Por ultimo utilizar LINQ para realizar las consultas y listo.

    Espero le sea de utilidad a alguien más.

    Nota: Talvez exista alguna otra forma más fácil u optima para realizar esta tarea, pero está me funcionó a la perfección.

    Saludos..

    • Marcado como respuesta César CM martes, 9 de octubre de 2012 18:16
    martes, 9 de octubre de 2012 18:16
  • Ayer por fin le llegué a la solución y como casí todo problema en programación, la solución resultó ser muy sencilla.

    Dejo los pasos para resolver este problema tomando como ejemplo el siguiente escenario:

    Existe una base de datos en SQL Server y una exactamente igual en MySQL. Se necesita que desde una misma aplicación se pueda conectar a los dos motores de Bases de Datos dependiendo de la conexión elegida al momento de ingresar al sistema. Para no tener problemas con la sintaxis de cada motor de base de datos se hace uso de LINQ y Entity Framework.

    Pasos:

    1- Añadir un elemento ADO.NET Entity Data Model al proyecto de Visual Studio y se configura para una base de datos en SQL Server.

    2- Ya creado el objeto .edmx, se hace clic derecho sobre él y se selecciona abrir con/ Editor XML(texto).

    3- Agregamos al proyecto un elemento de tipo XML y lo guardamos con extensión .ssdl (este archivo debe estar donde se encuentra el .exe de nustra aplicación).

    4- Copiamos todo lo que este dentro de la etiqueta "<Schema>" de nuestro archivo .edmx (incluyendo la etiqueta "<Schema>") y lo pegamos en nuestro archivo .ssdl recien creado.

    5- Ya en nuestro nuevo archivo .ssdl, modificamos la etiqueta "<Schema>" cambiando lo siguiente:

      * Provider="MySql.Data.MySqlClient"

    * ProviderManifestToken="2008"

    6- En el contenido de nuestro archivo .ssdl cambiamos el tipo de columna (de ser necesario), ya que los tipos de SQL Server y MySQL no son iguales.

    7- Las cadenas de conexión quedan de la siguiente manera:

    * SQL Server = "metadata=res://*/PruebaSQL_Server.csdl|res://*/PruebaSQL_Server.ssdl|res://*/PruebaSQL_Server.msl;provider=System.Data.SqlClient;provider connection string='data source=Servidor;initial catalog=BaseDatos;persist security info=True;user id=Usuario;password=Contraseña;multipleactiveresultsets=True;App=EntityFramework'"

    * MySQL = "metadata=PruebaMySQL.ssdl|res://*/PruebaSQL_Server.csdl|res://*/PruebaSQL_Server.msl;provider=MySql.Data.MySqlClient;provider connection string='server=Servidor;User Id=Usuario;password=Contraseña;port=Puerto;database=seg';"

    8- Con esto ya podemos instanciar nuestra clase que creo el Entity Framework (en el archivo .designer.cs que está dentro del archivo .edmx) y utilizar nuestra cadena de conexión.

    9- Por ultimo utilizar LINQ para realizar las consultas y listo.

    Espero le sea de utilidad a alguien más.

    Nota: Talvez exista alguna otra forma más fácil u optima para realizar esta tarea, pero está me funcionó a la perfección.

    Saludos..

    Yo hice algo parecido y me sale que no encuentra la tabla xxx en el esquema yyy y la tabla esta creada, por último existe la posibilidad de cambiar la propiedad ProviderManifestToken desde código?


    memo

    miércoles, 2 de enero de 2013 15:47