我使用的是MySQL8.0,NuGet包如下(版本也是选择8.0)
MySql.EntityFrameworkCore
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Relational
我选择的应用是Window窗体应用,但不是.NetFramework,因为版本原因并不支持8.0版本的NuGet包,低版本的似乎不兼容8.0版本的MySQL数据库,具体原因我不了解,能跑通就是好程序。
下面开始代码开发。首先新建一个MyDbContext类,继承于DbContext,主要用于连接数据库的上下文,下面是MyDbContext类的代码
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WinFormsApp1.MySql
{
public class MyDbContext : DbContext
{
public DbSet<data1> tb_data1 { get; set; }
/// <summary>
/// 链接到数据库回调
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 链接信息
string sql = @"Server=localhost; Port=3306; Database=testdb; User=root; Password=@Nutrition!123@;";
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是实体类,也就是我们的表,下面附上代码
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WinFormsApp1.MySql
{
public class data1
{
/// <summary>
/// EF默认名称为ID的变量为键值
/// </summary>
[Key]
public int key { get; set; }
public string text1 { get; set; }
public string text2 { get; set; }
}
}
到这里运行程序,只要不报错那我们就是成功一半了。这时候我们还没有调用MyDbcontext类。
现在我们要初始化数据库,这么做的目的是确保库和表都存在,不存在EF也会帮我们建好。我的设计是在Form的加载事件(Load)中实现,下面是代码
private void Form1_Load(object sender, EventArgs e)
{
InitMySql();
}
private void InitMySql()
{
try
{
// 尝试初始化数据库。
// 如果数据库存在,则不会新建数据库和表
// 如果不存在,则会新建数据库和表
MyDb.Database.EnsureCreated();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
其中MyDb是全局变量,是new的MyDbContext对象
private MyDbContext MyDb = new MyDbContext();
确保运行代码没报错并且库和表都被自动生成以后我们就可以设计页面了。下面是我自己的页面设计
我们一个个实现,首先是读取。在这之前我们可以先在数据库新增条数据,这样可以看到效果。
我们先设计读取按钮和DataGridView控件,我们需要实现的效果是点击读取之后DataGridView显示出数据。
在读取按钮的Click事件中,写上下面的代码
private void btnRead_Click(object sender, EventArgs e)
{
// 清除DataGridView的旧数据
dGView1.Columns.Clear();
// 读取方法,一般用这个
using (MyDbContext db = new MyDbContext())
{
List<data1> data = db.tb_data1.ToList();
dGView1.DataSource = new BindingList<data1>(data);
}
}
这时候点击读取就可以看到效果了。这时候增删改查的查已经完成了。下面开始新增。
设计一个写入按钮以及一个TextBox控件用于获取需要新增的值。写入的Click事件代码如下
private void btnWrite_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtBox1.Text))
{
MessageBox.Show("请输入写入的值");
}
else
{
data1 data = new data1();
data.text1 = txtBox1.Text;
data.text2 = DateTime.Now.ToString();
#region 第一种,使用MyDbContext类进行操作,一般使用这个
using (MyDbContext db = new MyDbContext())
{
db.tb_data1.Add(data);
if (db.SaveChanges() > 0)
{
MessageBox.Show("新增成功");
}
else
{
MessageBox.Show("新增失败");
}
}
btnRead_Click(sender, e);
#endregion
#region 第二种,直接使用sql命令
//int ret = MyDb.Database.ExecuteSqlInterpolated($"insert into tb_data1(text1,text2) values({txtBox1.Text},{DateTime.Now.ToString()})");
//if (ret > 0)
//{
// MessageBox.Show("新增成功");
//}
//else
//{
// MessageBox.Show("新增失败");
//}
//btnRead_Click(sender, e);
#endregion
}
}
下面代码中就不使用sql命令的方式了,一般用第一种。
按照写入的设计方式设计修改,下面是修改的Click事件代码
private void btnEdit_Click(object sender, EventArgs e)
{
//判断选中的数据条数
if (dGView1.SelectedRows.Count == 0)
{
MessageBox.Show("需要选择一条数据哦");
return;
}
if (dGView1.SelectedRows.Count > 1)
{
MessageBox.Show("只能选一条数据进行修改哦~");
return;
}
if (string.IsNullOrWhiteSpace(txtBox2.Text))
{
MessageBox.Show("请输入修改的值");
return;
}
//选中数据的主键
var id = (int)dGView1.SelectedRows[0].Cells["key"].Value;
// 修改
using (MyDbContext db = new MyDbContext())
{
data1 data = db.tb_data1.FirstOrDefault(a => a.key == id);
if (data == null)
{
MessageBox.Show("该数据不存在哦");
return;
}
data.text1 = txtBox2.Text;
data.text2 = DateTime.Now.ToString();
// 保存
if (db.SaveChanges() > 0)
{
MessageBox.Show("修改成功");
}
else
{
MessageBox.Show("修改失败");
}
// 重新赋值数据源
btnRead_Click(sender, e);
}
}
下面开始删除,第一种是删除一条数据,Click事件的代码如下
private void btn_OneDelete_Click(object sender, EventArgs e)
{
if (dGView1.SelectedRows.Count == 0)
{
MessageBox.Show("需要选择一条数据哦");
return;
}
if (dGView1.SelectedRows.Count > 1)
{
MessageBox.Show("只能选择一条数据哦");
return;
}
int id = (int)dGView1.SelectedRows[0].Cells["key"].Value;
using (MyDbContext db = new MyDbContext())
{
data1 data = db.tb_data1.FirstOrDefault(a => a.key == id);
if (data == null)
{
MessageBox.Show("数据不存在呀");
return;
}
db.tb_data1.Remove(data);
if (db.SaveChanges() > 0)
{
MessageBox.Show("删除成功了");
}
else
{
MessageBox.Show("删除失败了");
}
btnRead_Click(sender, e);
}
}
多条删除的Click事件代码如下
private void btn_MoreDelete_Click(object sender, EventArgs e)
{
if (dGView1.SelectedRows.Count == 0)
{
MessageBox.Show("请选择至少一条数据哦");
return;
}
List<int> ids = new List<int>();
// 遍历,获取id集合
foreach (DataGridViewRow item in dGView1.SelectedRows)
{
ids.Add((int)item.Cells["key"].Value);
}
using (MyDbContext db = new MyDbContext())
{
List<data1> datas = db.tb_data1.Where(a => ids.Contains(a.key)).ToList();
db.tb_data1.RemoveRange(datas);
if (db.SaveChanges() > 0)
{
MessageBox.Show("删除成功");
}
else
{
MessageBox.Show("删除失败");
}
btnRead_Click(sender, e);
}
}
至此,增删改查已经完成,希望可以帮助到你们。该功能是参照一个大佬的代码仿写的,下面是他的网站,大家可以去看看。