让Linq与Mysql和Mono玩得很好,这是可能的

本文关键字:很好 Linq Mysql Mono | 更新日期: 2023-09-27 18:17:04

我一直在尝试让Linq与Ubuntu上的Mysql一起工作,使用存储库中的Mono版本(2.10.5),除了头痛之外什么都没有。

首先,我必须修改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 

有人知道是否可以使用Linq和Mono连接到MySQL吗?我是不是漏掉了什么?

谢谢!

让Linq与Mysql和Mono玩得很好,这是可能的

我不知道为什么每个人似乎都认为LINQ to SQL在Mono上不起作用。
Mono定期发展:到今天为止,LINQ to SQL在Mono和MySQL上工作得很好(我在PostgreSQL上成功地使用了它)。

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

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

"FROM [test].[Users]"

应该是

"FROM `test`.`Users`"

尝试在您的连接字符串中添加"DbLinqProvider=MySql"。这应该能解决你的问题。
参见:http://www.mono-project.com/Release_Notes_Mono_2.6#LINQ_to_SQL

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