<h1>C#环境下使用EF操作MySql - <span class="color_h1">(第一讲)</span></h1><p><br/></p><p>开发环境为 Visual Studio 2019。</p><p><br/></p><p>视频讲解如下:</p><p><embed src="//player.bilibili.com/player.html?aid=374404961&bvid=BV1rZ4y1A7An&cid=444146288&page=1&high_quality=1&danmaku=0" width="817" height="460" wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true"/><br/></p><p>源码下载,提取码:jiyo </p><p><a target="_blank" href="https://pan.baidu.com/s/1J9T0AEll3DgNBIWyD9r3VQ ">https://pan.baidu.com/s/1J9T0AEll3DgNBIWyD9r3VQ</a></p><p><br/></p><p>本章节主要给大家讲解如何使用EntityFrameworkCore对MySql数据库进行增删改查操作,其中也包括如使用EntityFrameworkCore直接执行sql命令。</p><p><br/></p><p>需要安装的第三方库如下:</p><p>MySql.EntityFrameworkCore</p><p>Microsoft.EntityFrameworkCore</p><p>Microsoft.EntityFrameworkCore.Relational</p><p><br/></p><p>界面设计如下:</p><p><img class="pimg" src="/upload/image/QQ截图20211117202118.jpg"/></p><p><br/></p><p>Form1.cs 代码如下:</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:c#;toolbar:false;">using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using WindowsFormsApp.MySql;
namespace WindowsFormsApp
{
public partial class Form1 : Form
{
private MyDbContext MyDb = new MyDbContext();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
InitMySql();
}
private void InitMySql()
{
try
{
// 尝试初始化数据库。
// 如果数据库存在,则不会新建数据库和表
// 如果不存在,则会新建数据库和表
MyDb.Database.EnsureCreated();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
private void button读取_Click(object sender, EventArgs e)
{
dataGridView1.Columns.Clear();
// 第一种读取方法
//List<data1> data = MyDb.tb_data1.ToList(); // 读取tb_data1表所有数据
//dataGridView1.DataSource = new BindingList<data1>(data);
// 第二种读取方法
//using(MyDbContext db = new MyDbContext())
//{
// List<data1> data = db.tb_data1.ToList(); // 读取tb_data1表所有数据
// dataGridView1.DataSource = new BindingList<data1>(data);
// db.Dispose();
//}
// 第三种读取方法,直接使用sql命令进行读取
List<data1> data = MyDb.tb_data1.FromSqlRaw("SELECT * FROM tb_data1").ToList();
if (data.Count() > 0)
{
dataGridView1.DataSource = new BindingList<data1>(data);
MessageBox.Show("读取成功.");
}
else
{
MessageBox.Show("读取失败.");
}
}
private void button写入_Click(object sender, EventArgs e)
{
//data1 data = new data1();
//data.text1 = DateTime.Now.ToString();
//data.text2 = textBox1.Text;
// 第一种,使用MyDb进行写入操作
#region
//MyDb.tb_data1.Add(data);
//if(MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("新增成功.");
//}
//else
//{
// MessageBox.Show("新增失败.");
//}
#endregion
// 第二种,使用MyDbContext类进行写入操作(正常情况下使用这种)
#region
//using (MyDbContext db = new MyDbContext())
//{
// db.tb_data1.Add(data);
// if(db.SaveChanges() > 0)
// {
// MessageBox.Show("新增成功.");
// }
// else
// {
// MessageBox.Show("新增失败.");
// }
// db.Dispose(); // 释放资源,可以不需要
//}
#endregion
// 第三种,直接使用sql命令进行插入
int ret = MyDb.Database.ExecuteSqlInterpolated($"INSERT INTO tb_data1 (text1,text2) VALUES({DateTime.Now},{textBox1.Text})");
if (ret > 0)
{
MessageBox.Show("新增成功.");
}
else
{
MessageBox.Show("新增失败.");
}
}
private void button修改_Click(object sender, EventArgs e)
{
int id = int.Parse(textBox2.Text);
// 第一种,使用MyDb进行修改操作
#region
// 查询键值为id的数据
//data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
//if(data != null)
//{
// data.text2 = textBox1.Text;
//}
//// 保存
//if (MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("修改成功.");
//}
//else
//{
// MessageBox.Show("修改失败.");
//}
#endregion
// 第二种,使用MyDbContext类进行修改操作(正常情况下使用这种)
using (MyDbContext db = new MyDbContext())
{
data1 data = db.tb_data1.FirstOrDefault(x => x.key == id);
if (data != null)
{
data.text2 = textBox1.Text;
}
if (db.SaveChanges() > 0)
{
MessageBox.Show("修改成功.");
}
else
{
MessageBox.Show("修改失败.");
}
db.Dispose(); // 释放资源,可以不需要
}
}
private void button删除_Click(object sender, EventArgs e)
{
int id = int.Parse(textBox2.Text);
// 第一种,使用MyDb进行删除操作
#region
// 查询键值为id的数据
//data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
//MyDb.tb_data1.Remove(data);
//// 保存
//if (MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("删除成功.");
//}
//else
//{
// MessageBox.Show("删除失败.");
//}
#endregion
// 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
using (MyDbContext db = new MyDbContext())
{
data1 d = db.tb_data1.FirstOrDefault(x => x.key == id);
db.tb_data1.Remove(d);
if (db.SaveChanges() > 0)
{
MessageBox.Show("删除成功.");
}
else
{
MessageBox.Show("删除失败.");
}
db.Dispose(); // 释放资源,可以不需要
}
}
private void button删除多条_Click(object sender, EventArgs e)
{
// 第一种,使用MyDb进行删除操作
// 查询所有text2的值等于textBox1.Text的数据
//List<data1> data = MyDb.tb_data1.Where(x => x.text2 == textBox1.Text).ToList();
// 删除所有text2的值等于textBox1.Text的数据
//MyDb.tb_data1.RemoveRange(data);
//// 保存
//if (MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("批量删除成功.");
//}
//else
//{
// MessageBox.Show("批量删除失败.");
//}
// 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
using (MyDbContext db = new MyDbContext())
{
// 删除所有text2的值等于textBox1.Text的数据
db.tb_data1.RemoveRange(db.tb_data1.Where(x => x.text2 == textBox1.Text));
if (db.SaveChanges() > 0)
{
MessageBox.Show("批量删除成功.");
}
else
{
MessageBox.Show("批量删除失败.");
}
db.Dispose(); // 释放资源,可以不需要
}
}
}
}</pre><p>MyDbContext.cs 代码如下</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:c#;toolbar:false;">using Microsoft.EntityFrameworkCore;
namespace WindowsFormsApp.MySql
{
/// <summary>
/// 外部调用,操作数据库的接口
/// </summary>
public class MyDbContext : DbContext
{
#region 数据库表
public DbSet<data1> tb_data1 { get; set; }
public DbSet<data2> tb_data2 { get; set; }
#endregion
/// <summary>
/// 链接到数据库回调
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 链接信息
string sql = @"Server=localhost; Port=3306; Database=test; User=root; Password=123456; CharSet=utf8; Allow User Variables=true;";
optionsBuilder.UseMySQL(sql);
}
/// <summary>
/// 数据模式回调
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 如果需要将表中某个字段从数据库中排除,但又不想在代码中删除该字段,可以用如下方法
// modelBuilder.Entity<表名>().Ignore(x => x.字段);
//
// 例如,将Tb_rdata表中text字段排除
//modelBuilder.Entity<data1>().Ignore(x => x.text1);
// 如果该表不存在键值,则可以采用如下方法
// modelBuilder.Entity<表名>().HasNoKey();
//
// 例如:
//modelBuilder.Entity<data1>().HasNoKey();
}
}
}</pre><p><br/></p><p>data1.cs 代码如下</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:c#;toolbar:false;">using System.ComponentModel.DataAnnotations;
namespace mysql.MySql
{
public class data1
{
/// <summary>
/// 添加键值,默认名称是id,数据类型为int
/// </summary>
[Key]
public int ids { get; set; }
/// <summary>
/// 文本数据
/// </summary>
public string text { get; set; }
}
}</pre><p><br/></p><p>data2.cs 代码如下</p><pre style="overflow-x: auto; font-size: 15px;" class="brush:c#;toolbar:false;">namespace WindowsFormsApp.MySql
{
public class data2
{
/// <summary>
/// EF 默认名称为ID的变量为键值
/// </summary>
public int id { get; set; }
/// <summary>
/// 数据
/// </summary>
public string text { get; set; }
}
}</pre><p><br/></p><p>还有一种不使用EF的链接方式:</p><pre class="brush:c#;toolbar:false">string sql = @"SELECT * FROM tb_data1";
string constr = @"Server=localhost; Port=3306; Database=test; User=root; Password=JYZN_2331_agv; CharSet=utf8; Allow User Variables=true;";
// 连接到数据库
MySqlConnection sqlCon = new MySqlConnection(constr);
sqlCon.Open();
// 执行sql命令
MySqlCommand sqlCmd = new MySqlCommand(sql, sqlCon);
MySqlDataAdapter ad = new MySqlDataAdapter(sqlCmd);
DataSet ds = new DataSet();
ad.Fill(ds);
ds.Dispose();</pre><p><br/></p>
C#环境下使用EF操作MySql - (第一讲)
开发环境为 Visual Studio 2019。
视频讲解如下:
源码下载,提取码:jiyo
https://pan.baidu.com/s/1J9T0AEll3DgNBIWyD9r3VQ
本章节主要给大家讲解如何使用EntityFrameworkCore对MySql数据库进行增删改查操作,其中也包括如使用EntityFrameworkCore直接执行sql命令。
需要安装的第三方库如下:
MySql.EntityFrameworkCore
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Relational
界面设计如下:
Form1.cs 代码如下:
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using WindowsFormsApp.MySql;
namespace WindowsFormsApp
{
public partial class Form1 : Form
{
private MyDbContext MyDb = new MyDbContext();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
InitMySql();
}
private void InitMySql()
{
try
{
// 尝试初始化数据库。
// 如果数据库存在,则不会新建数据库和表
// 如果不存在,则会新建数据库和表
MyDb.Database.EnsureCreated();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
private void button读取_Click(object sender, EventArgs e)
{
dataGridView1.Columns.Clear();
// 第一种读取方法
//List<data1> data = MyDb.tb_data1.ToList(); // 读取tb_data1表所有数据
//dataGridView1.DataSource = new BindingList<data1>(data);
// 第二种读取方法
//using(MyDbContext db = new MyDbContext())
//{
// List<data1> data = db.tb_data1.ToList(); // 读取tb_data1表所有数据
// dataGridView1.DataSource = new BindingList<data1>(data);
// db.Dispose();
//}
// 第三种读取方法,直接使用sql命令进行读取
List<data1> data = MyDb.tb_data1.FromSqlRaw("SELECT * FROM tb_data1").ToList();
if (data.Count() > 0)
{
dataGridView1.DataSource = new BindingList<data1>(data);
MessageBox.Show("读取成功.");
}
else
{
MessageBox.Show("读取失败.");
}
}
private void button写入_Click(object sender, EventArgs e)
{
//data1 data = new data1();
//data.text1 = DateTime.Now.ToString();
//data.text2 = textBox1.Text;
// 第一种,使用MyDb进行写入操作
#region
//MyDb.tb_data1.Add(data);
//if(MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("新增成功.");
//}
//else
//{
// MessageBox.Show("新增失败.");
//}
#endregion
// 第二种,使用MyDbContext类进行写入操作(正常情况下使用这种)
#region
//using (MyDbContext db = new MyDbContext())
//{
// db.tb_data1.Add(data);
// if(db.SaveChanges() > 0)
// {
// MessageBox.Show("新增成功.");
// }
// else
// {
// MessageBox.Show("新增失败.");
// }
// db.Dispose(); // 释放资源,可以不需要
//}
#endregion
// 第三种,直接使用sql命令进行插入
int ret = MyDb.Database.ExecuteSqlInterpolated($"INSERT INTO tb_data1 (text1,text2) VALUES({DateTime.Now},{textBox1.Text})");
if (ret > 0)
{
MessageBox.Show("新增成功.");
}
else
{
MessageBox.Show("新增失败.");
}
}
private void button修改_Click(object sender, EventArgs e)
{
int id = int.Parse(textBox2.Text);
// 第一种,使用MyDb进行修改操作
#region
// 查询键值为id的数据
//data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
//if(data != null)
//{
// data.text2 = textBox1.Text;
//}
//// 保存
//if (MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("修改成功.");
//}
//else
//{
// MessageBox.Show("修改失败.");
//}
#endregion
// 第二种,使用MyDbContext类进行修改操作(正常情况下使用这种)
using (MyDbContext db = new MyDbContext())
{
data1 data = db.tb_data1.FirstOrDefault(x => x.key == id);
if (data != null)
{
data.text2 = textBox1.Text;
}
if (db.SaveChanges() > 0)
{
MessageBox.Show("修改成功.");
}
else
{
MessageBox.Show("修改失败.");
}
db.Dispose(); // 释放资源,可以不需要
}
}
private void button删除_Click(object sender, EventArgs e)
{
int id = int.Parse(textBox2.Text);
// 第一种,使用MyDb进行删除操作
#region
// 查询键值为id的数据
//data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
//MyDb.tb_data1.Remove(data);
//// 保存
//if (MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("删除成功.");
//}
//else
//{
// MessageBox.Show("删除失败.");
//}
#endregion
// 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
using (MyDbContext db = new MyDbContext())
{
data1 d = db.tb_data1.FirstOrDefault(x => x.key == id);
db.tb_data1.Remove(d);
if (db.SaveChanges() > 0)
{
MessageBox.Show("删除成功.");
}
else
{
MessageBox.Show("删除失败.");
}
db.Dispose(); // 释放资源,可以不需要
}
}
private void button删除多条_Click(object sender, EventArgs e)
{
// 第一种,使用MyDb进行删除操作
// 查询所有text2的值等于textBox1.Text的数据
//List<data1> data = MyDb.tb_data1.Where(x => x.text2 == textBox1.Text).ToList();
// 删除所有text2的值等于textBox1.Text的数据
//MyDb.tb_data1.RemoveRange(data);
//// 保存
//if (MyDb.SaveChanges() > 0)
//{
// MessageBox.Show("批量删除成功.");
//}
//else
//{
// MessageBox.Show("批量删除失败.");
//}
// 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
using (MyDbContext db = new MyDbContext())
{
// 删除所有text2的值等于textBox1.Text的数据
db.tb_data1.RemoveRange(db.tb_data1.Where(x => x.text2 == textBox1.Text));
if (db.SaveChanges() > 0)
{
MessageBox.Show("批量删除成功.");
}
else
{
MessageBox.Show("批量删除失败.");
}
db.Dispose(); // 释放资源,可以不需要
}
}
}
} MyDbContext.cs 代码如下
using Microsoft.EntityFrameworkCore;
namespace WindowsFormsApp.MySql
{
/// <summary>
/// 外部调用,操作数据库的接口
/// </summary>
public class MyDbContext : DbContext
{
#region 数据库表
public DbSet<data1> tb_data1 { get; set; }
public DbSet<data2> tb_data2 { get; set; }
#endregion
/// <summary>
/// 链接到数据库回调
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 链接信息
string sql = @"Server=localhost; Port=3306; Database=test; User=root; Password=123456; CharSet=utf8; Allow User Variables=true;";
optionsBuilder.UseMySQL(sql);
}
/// <summary>
/// 数据模式回调
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 如果需要将表中某个字段从数据库中排除,但又不想在代码中删除该字段,可以用如下方法
// modelBuilder.Entity<表名>().Ignore(x => x.字段);
//
// 例如,将Tb_rdata表中text字段排除
//modelBuilder.Entity<data1>().Ignore(x => x.text1);
// 如果该表不存在键值,则可以采用如下方法
// modelBuilder.Entity<表名>().HasNoKey();
//
// 例如:
//modelBuilder.Entity<data1>().HasNoKey();
}
}
}
data1.cs 代码如下
using System.ComponentModel.DataAnnotations;
namespace mysql.MySql
{
public class data1
{
/// <summary>
/// 添加键值,默认名称是id,数据类型为int
/// </summary>
[Key]
public int ids { get; set; }
/// <summary>
/// 文本数据
/// </summary>
public string text { get; set; }
}
}
data2.cs 代码如下
namespace WindowsFormsApp.MySql
{
public class data2
{
/// <summary>
/// EF 默认名称为ID的变量为键值
/// </summary>
public int id { get; set; }
/// <summary>
/// 数据
/// </summary>
public string text { get; set; }
}
}
还有一种不使用EF的链接方式:
string sql = @"SELECT * FROM tb_data1";
string constr = @"Server=localhost; Port=3306; Database=test; User=root; Password=JYZN_2331_agv; CharSet=utf8; Allow User Variables=true;";
// 连接到数据库
MySqlConnection sqlCon = new MySqlConnection(constr);
sqlCon.Open();
// 执行sql命令
MySqlCommand sqlCmd = new MySqlCommand(sql, sqlCon);
MySqlDataAdapter ad = new MySqlDataAdapter(sqlCmd);
DataSet ds = new DataSet();
ad.Fill(ds);
ds.Dispose();