在C#项目中操作MySQL数据库时,MySqlConnector是官方推荐的高性能ADO.NET驱动,搭配EF Core可以实现对象关系映射,大幅降低数据操作的代码量。下面将从基础连接到EF Core配置逐步讲解完整实现过程。

一、基础环境准备
首先需要创建C#项目,这里以.NET 6控制台项目为例,然后通过NuGet安装必要的依赖包:
- MySqlConnector:用于底层MySQL连接
- Microsoft.EntityFrameworkCore:EF Core核心包
- Microsoft.EntityFrameworkCore.Tools:用于执行迁移命令
- MySqlConnector.EntityFrameworkCore:EF Core的MySQL提供程序
可以在NuGet包管理器中搜索安装,也可以通过命令行安装:
# 安装MySqlConnector dotnet add package MySqlConnector # 安装EF Core核心包 dotnet add package Microsoft.EntityFrameworkCore # 安装EF Core工具包 dotnet add package Microsoft.EntityFrameworkCore.Tools # 安装EF Core MySQL提供程序 dotnet add package MySqlConnector.EntityFrameworkCore
二、使用MySqlConnector直接连接MySQL
如果不使用EF Core,仅用MySqlConnector实现基础连接和查询,代码如下:
2.1 基础连接查询示例
using MySqlConnector;
// 数据库连接字符串,替换成自己的数据库信息
string connectionString = "Server=localhost;Port=3306;Database=test_db;Uid=root;Pwd=123456;";
// 创建连接对象
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
try
{
// 打开连接
connection.Open();
Console.WriteLine("MySQL连接成功");
// 创建查询命令
string sql = "SELECT id, name, age FROM user_info";
using (MySqlCommand command = new MySqlCommand(sql, connection))
{
// 执行查询获取结果集
using (MySqlDataReader reader = command.ExecuteReader())
{
// 遍历结果集
while (reader.Read())
{
int id = reader.GetInt32("id");
string name = reader.GetString("name");
int age = reader.GetInt32("age");
Console.WriteLine($"用户id:{id},姓名:{name},年龄:{age}");
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"连接或查询失败:{ex.Message}");
}
}
2.2 插入数据示例
using MySqlConnector;
string connectionString = "Server=localhost;Port=3306;Database=test_db;Uid=root;Pwd=123456;";
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open();
// 参数化插入语句,避免SQL注入
string insertSql = "INSERT INTO user_info (name, age) VALUES (@name, @age)";
using (MySqlCommand command = new MySqlCommand(insertSql, connection))
{
// 添加参数
command.Parameters.AddWithValue("@name", "张三");
command.Parameters.AddWithValue("@age", 25);
// 执行插入,返回受影响行数
int rows = command.ExecuteNonQuery();
Console.WriteLine($"插入成功,受影响行数:{rows}");
}
}
三、EF Core配置MySQL连接
使用EF Core可以实现实体类和数据库表的映射,无需手动编写SQL语句操作数据,首先定义实体类和数据库上下文。
3.1 定义实体类
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
// 对应数据库中的user_info表
[Table("user_info")]
public class UserInfo
{
// 主键
[Key]
[Column("id")]
public int Id { get; set; }
[Column("name")]
public string Name { get; set; }
[Column("age")]
public int Age { get; set; }
}
3.2 定义数据库上下文
using Microsoft.EntityFrameworkCore;
public class TestDbContext : DbContext
{
// 定义UserInfo对应的DbSet
public DbSet<UserInfo> UserInfos { get; set; }
// 配置数据库连接
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 使用MySqlConnector作为提供程序,替换成自己的连接字符串
string connectionString = "Server=localhost;Port=3306;Database=test_db;Uid=root;Pwd=123456;";
optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
}
// 可选:配置实体和表的映射规则
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 可以额外配置字段属性,比如长度、默认值等
modelBuilder.Entity<UserInfo>()
.Property(u => u.Name)
.HasMaxLength(50);
}
}
3.3 执行数据库迁移
定义好上下文后,需要执行迁移命令生成数据库表:
# 添加迁移文件,命名可以自定义 dotnet ef migrations add InitialCreate # 执行迁移,创建数据库表 dotnet ef database update
3.4 EF Core增删改查操作
using System;
using System.Linq;
// 查询所有用户
using (TestDbContext context = new TestDbContext())
{
var allUsers = context.UserInfos.ToList();
foreach (var user in allUsers)
{
Console.WriteLine($"id:{user.Id},姓名:{user.Name},年龄:{user.Age}");
}
}
// 新增用户
using (TestDbContext context = new TestDbContext())
{
UserInfo newUser = new UserInfo
{
Name = "李四",
Age = 28
};
context.UserInfos.Add(newUser);
// 保存更改到数据库
int result = context.SaveChanges();
Console.WriteLine($"新增成功,受影响行数:{result}");
}
// 修改用户
using (TestDbContext context = new TestDbContext())
{
// 查找id为1的用户
UserInfo userToUpdate = context.UserInfos.FirstOrDefault(u => u.Id == 1);
if (userToUpdate != null)
{
userToUpdate.Age = 26;
context.SaveChanges();
Console.WriteLine("修改成功");
}
}
// 删除用户
using (TestDbContext context = new TestDbContext())
{
UserInfo userToDelete = context.UserInfos.FirstOrDefault(u => u.Id == 2);
if (userToDelete != null)
{
context.UserInfos.Remove(userToDelete);
context.SaveChanges();
Console.WriteLine("删除成功");
}
}
四、常见问题说明
在实际使用中可能会遇到以下问题:
- 连接字符串错误:检查Server、Port、Database、Uid、Pwd是否正确,确保MySQL服务已启动
- 迁移失败:确认MySqlConnector.EntityFrameworkCore版本和EF Core核心版本匹配,避免版本冲突
- 实体映射错误:检查
[Table]和[Column]特性标注的表名、列名是否和数据库实际一致
如果需要连接远程MySQL数据库,只需把连接字符串中的Server替换成远程服务器IP即可,若远程连接失败,需要检查MySQL是否开启了远程访问权限,以及服务器防火墙是否开放了3306端口。
C#MySqlConnectorEF_CoreMySQL修改时间:2026-06-28 20:45:42