让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 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的实现仍然不完整(例如,不支持编译查询),但足以开发一个完整的应用程序。