C# 让Linq在Mysql和Mono上玩得很好,有可能吗?

C# 让Linq在Mysql和Mono上玩得很好,有可能吗?,c#,mysql,linq,mono,C#,Mysql,Linq,Mono,我一直在尝试让Linq在Ubuntu上使用Mysql,在存储库(2.10.5)中使用Mono版本,但除了头疼之外,我什么也没有得到 首先,我必须修改MySQL提供程序sqlmetal.exe.config,因为默认情况下它被设置为一个旧的和不推荐的版本。我设法使它能够将我在这台机器上安装的MySQL连接器(从存储库)设置为sqlmetal的提供程序。我用sqlmetal为我的目标数据库生成了DataContext,这似乎有效,但我不能完全确定 在生成DataContext之后,我在monodev

我一直在尝试让Linq在Ubuntu上使用Mysql,在存储库(2.10.5)中使用Mono版本,但除了头疼之外,我什么也没有得到

首先,我必须修改MySQL提供程序sqlmetal.exe.config,因为默认情况下它被设置为一个旧的和不推荐的版本。我设法使它能够将我在这台机器上安装的MySQL连接器(从存储库)设置为sqlmetal的提供程序。我用sqlmetal为我的目标数据库生成了DataContext,这似乎有效,但我不能完全确定

在生成DataContext之后,我在monodevelop上创建了一个新项目来测试这一点,首先我尝试使用一个简单的MysqlConenction并检查连接器是否正常工作,我必须将连接器程序集添加到项目中,但这很好,它起了作用。 然后,我尝试使用以下代码使用DataContext进行连接:

    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);
                }
            }
        }
    }
此代码失败。Linq似乎正在为MySQL生成糟糕的SQL代码,至少它抛出的异常似乎是这样的:

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 
未处理的异常:MySql.Data.MySqlClient.MySqlException:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在“[Id]、[Password]、[Username]附近使用的正确语法
来自第1行的[test].[Users]'
在0中的MySql.Data.MySqlClient.MySqlStream.ReadPacket()[0x00000]处
在MySql.Data.MySqlClient.NativeDriver.GetResult(System.Int32&affectedRow,System.Int32&insertedId)[0x00000]中:0
[错误]未处理的致命异常:MySql.Data.MySqlClient.MySqlException:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在“[Id]、[Password]、[Username]附近使用的正确语法
来自第1行的[test].[Users]'
在0中的MySql.Data.MySqlClient.MySqlStream.ReadPacket()[0x00000]处
在MySql.Data.MySqlClient.NativeDriver.GetResult(System.Int32&affectedRow,System.Int32&insertedId)[0x00000]中:0
有人知道是否可以使用Linq和Mono连接到MySQL吗?有什么我遗漏的吗


谢谢

我不知道为什么每个人似乎都认为LINQtoSQL在Mono上不起作用。
Mono的发展是有规律的:到今天为止,LinqtoSQL在Mono和MySQL上运行良好(我在PostgreSQL中成功地使用了它)

代码中有一个小错误:您没有在连接字符串中指定DbLinqProvider。这是生成针对MySQL的SQL代码所必需的

在这种情况下,生成的SQL代码特定于SQL Server:

"FROM [test].[Users]"
应该是

"FROM `test`.`Users`"
尝试在连接字符串中添加“DbLinqProvider=MySql”。这将解决您的问题。
见:


您应该知道Mono/DbLinq实现仍然不完整(例如,不支持编译查询),但足以开发一个完整的应用程序。

这个问题已经在这里讨论过了,我读过这个问题,但这是一个3年前的问题,我想事情会有所改变……我已经尝试过了,但是,当我向MysqlConenction构造函数添加DbLinqProvider=MySql时,它会抛出一个“System.ArgumentException:关键字notsupported.Parameter name:DbLinqProvider”异常,如果我尝试使用以下字符串创建DataContext:“DbLinqProvider=MySql;Userid=root;database=test;server=localhost;password=password”,它会抛出一个“System.Data.SqlClient.SqlException:服务器不存在或连接被拒绝。“例外。我相信最后一个原因是,它试图使用SqlConnector,据我所知,它不应该使用SqlConnector。如果使用DataContext,则必须在连接字符串中包含DbLinqConnectionType。就我个人而言,我从不使用MySqlConnection的直接实例。相反,我在构造函数中使用带有完整连接字符串的DataContext实例,如下所示:
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”);
谢谢,这确实有效。我想这是有文档记录的,但不知道在哪里:-/