从System.Data.Common 之上的非常低级别的实现到功能丰富的框架(如 EF),有大量不同的框架。
这些框架中的大多数都不是 MySQL 特定的,因为 ADO.NET 提供了一个很好的抽象级别,它独立于底层数据库(一些 SQL 方言特定的细节除外)。
作为一个起点,我会推荐 EF,因为它有据可查
http://entityframework.codeplex.com/
和 Dapper(Stackoverflow 本身在 Dapper afaik 上运行)
https://code.google.com/p/dapper-dot-net/
它不支持开箱即用的 CRUD 操作,但上面有框架。
https://github.com/tmsmith/Dapper-Extensions
更新
简单介绍一下 ADO.NET
每个 ADO.NET驱动的基本概念是
这意味着每个DatabaseName ADO.NET 提供程序都有一个DatabaseNameConnection、DatabaseNameCommand(和其他一些)。
这是一些非常基本的示例代码,用于从 mysql 数据库中检索数据
private DataTable GetUsers()
{
using (var conn = new MySqlConnection("Server=localhost;Database=mysql;Uid=root"))
using (var cmd = new MySqlCommand("SELECT * FROM user", conn))
{
conn.Open();
using (var reader = cmd.ExecuteReader())
{
var table = new DataTable();
table.Load(reader);
return table;
}
}
}
这是完全硬连接到 mysql,因为我们使用的是 MySqlConnection 和 MySqlCommand,但这里真正的 mysql 是什么?只有连接字符串和原始 sql 查询。但是让我重写它,这样我就可以使用 ADO.net 提供程序从每个数据库中获取数据。
更多代码,但独立于提供者
public void SomeMethod()
{
var helper = new DbHelper("MySql.Data.MySqlClient", "Server=localhost;Database=mysql;Uid=root");
var users = helper.ExecuteDataTable("SELECT * FROM users");
}
public class DbHelper
{
private string providerName;
private string connectionString;
public DbHelper(string providerName, string connectionString)
{
this.providerName = providerName;
this.connectionString = connectionString;
}
private IDbConnection CreateConnection()
{
var factory = DbProviderFactories.GetFactory(providerName);
var conn = factory.CreateConnection();
conn.ConnectionString = connectionString;
conn.Open();
return conn;
}
private IDbCommand CreateCommand(IDbConnection conn, string commandText)
{
var cmd = conn.CreateCommand();
cmd.CommandText = commandText;
return cmd;
}
private DataTable ExecuteDataTable(IDataReader reader)
{
var table = new DataTable();
table.Load(reader);
return table;
}
public DataTable ExecuteDataTable(string commandText)
{
using (var conn = CreateConnection())
using (var cmd = CreateCommand(conn, commandText))
{
return ExecuteDataTable(cmd.ExecuteReader());
}
}
}
如果您安装了 MySQL 连接器/NET,这将有效,因为它将自己注册为机器范围内的 DbProvider,您甚至不需要在项目中引用 MySql.Data.dll。
如果您不想安装 Connector/NET,则必须
- 添加对 MySql.Data.dll 的引用
- 在您的 app.config/web.config 文件中添加一些行
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description="Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
</DbProviderFactories>
现在对DbProviderFactories.GetFactory(providerName); 的调用将为您提供MySql 特定的DbProviderFactory 实现。
大多数 DAL / ORM 框架都使用这个概念。最终,他们不必首先支持 MySQL(除非他们生成特定于数据库的 sql 命令)。 Entity Framework 有所作为,因为它需要提供者本身来支持它,这就是为什么你也需要MySql.Data.Entities。
只是一个快速提示。我谈到的所有内容都可以通过 nuget 获得。