2011-12-08 9 views
5

He estado tratando de hacer que Linq trabaje con Mysql en Ubuntu, usando la versión Mono en los repositorios (2.10.5) y no tengo más que dolores de cabeza.Hacer que Linq juegue bien con Mysql y Mono, ¿es posible?

En primer lugar, tuve que modificar el proveedor de MySQL sqlmetal.exe.config porque estaba configurado en una versión antigua y obsoleta de forma predeterminada, logré que funcionara configurando el conector MySQL que he instalado en esta máquina (de los repositorios) como el proveedor de sqlmetal. Genere el DataContext con sqlmetal para mi base de datos de destino, y eso pareció funcionar, pero no estoy del todo seguro.

Después de generar el DataContext creé un nuevo proyecto en monodesarrollo solo para probar esto, al principio traté de usar una MysqlConenction simple y verifiqué que el conector funcionaba correctamente, tuve que agregar el ensamblaje del conector al proyecto, pero está bien , funcionó. Luego trató de conectarse a través de la DataContext utilizando este código:

using System; 
    using System.Linq; 
    using System.Data.Linq; 
    using MySql.Data.MySqlClient; 

    namespace test 
    { 
      public class test 
     { 
      public static void Main (String[] args) 
      {   
       Test db = new Test (new MySqlConnection("Userid=root;database=test;server=localhost;password=password")); 

       foreach(var tr in db.Users) 
       { 
        Console.Write(tr.Username); 
       } 
      } 
     } 
    } 

Este código de falla. Parece LINQ está generando mal código SQL para MySQL, al menos la excepción que está lanzando parece decir que:

Unhandled Exception: MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[Id], [Password], [Username] 
FROM [test].[Users]' at line 1 
    at MySql.Data.MySqlClient.MySqlStream.ReadPacket() [0x00000] in <filename unknown>:0 
    at MySql.Data.MySqlClient.NativeDriver.GetResult (System.Int32& affectedRow, System.Int32& insertedId) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[Id], [Password], [Username] 
FROM [test].[Users]' at line 1 
    at MySql.Data.MySqlClient.MySqlStream.ReadPacket() [0x00000] in <filename unknown>:0 
    at MySql.Data.MySqlClient.NativeDriver.GetResult (System.Int32& affectedRow, System.Int32& insertedId) [0x00000] in <filename unknown>:0 

¿Alguien sabe si es posible conectarse a MySQL utilizando LINQ y Mono? ¿Se me escapa algo?

Gracias!

+0

Esta cuestión ya se ha discutido aquí http://stackoverflow.com/questions/42212/how-can-i-use-linq-with-a-mysql-database-on-mono – Eugene

+1

leí esa pregunta , pero es una pregunta de 3 años y pensé que las cosas habrían cambiado ... – uorbe001

Respuesta

5

No sé por qué todo el mundo parece pensar que LINQ to SQL no funciona en Mono.
Mono evoluciona regularmente: a partir de hoy, LINQ to SQL funciona bien con Mono y MySQL (y lo uso con éxito con PostgreSQL).

Hay un pequeño error en su código: no especifica DbLinqProvider en la cadena de conexión. Esto es necesario para producir código SQL dirigido a MySQL.

En este caso, el código SQL generado es específico de SQL Server:

"FROM [test].[Users]" 

debería haber sido

"FROM `test`.`Users`" 

intenta agregar "DbLinqProvider = MySQL" en la cadena de conexión. Esto debería solucionar tu problema.
Ver: http://www.mono-project.com/Release_Notes_Mono_2.6#LINQ_to_SQL

Debe tener en cuenta que la aplicación Mono/DbLinq es todavía incompleta (por ejemplo, las consultas compilados no son compatibles), pero más que suficiente para desarrollar una aplicación completa.

+0

Lo he intentado, pero cuando agrego el DbLinqProvider = MySsql al constructor MysqlConenction, arroja una "System.ArgumentException: palabra clave no compatible Nombre del parámetro: dblinqprovider "excepción, y si trato de crear el DataContext usando esta cadena:" DbLinqProvider = MySql; Userid = root; database = test; server = localhost; password = password "arroja un" System.Data.SqlClient " .SqlException: el servidor no existe o se rechazó la conexión. " excepción. Creo que el último es porque está tratando de usar el SqlConnector, que, por lo que sé, no debería ser. – uorbe001

+2

Si usa DataContext, debe incluir DbLinqConnectionType en la cadena de conexión. Personalmente, nunca uso una instancia directa de MySqlConnection. En su lugar utilizo una instancia de DataContext con una cadena de conexión completa en el constructor como esta: 'var db = new System.Data.Linq.DataContext (" Server = localhost; Database = MyDB; User Id = postgres; Password = MyPassword; DbLinqProvider = PostgreSql; DbLinqConnectionType = Npgsql.NpgsqlConnection, Npgsql, Version = 2.0.11.92, Culture = neutral, PublicKeyToken = 5d8b90d52f46fda7 ");' – CedX

+0

Gracias, eso funciona. Supongo que esto está documentado en alguna parte, pero no sé dónde: - / – uorbe001

Cuestiones relacionadas