目录
一、创建实体数据模型
1.建立数据库连接
2.建立EF实体模型
二.设计窗体和EF应用
1.窗体设计
2.应用程序设计
3.源码
4.生成效果
(1)查询
(2)修改
(3)删除
(4)增加
5.总结
一、创建实体数据模型
1.建立数据库连接
在SSMS建立数据库连接,比如db_EMS,建立数据表tb_stock,并设置主键。
2.建立EF实体模型
以db_EMS数据库为例,将已有的数据库表映射为实体数据,操作步骤如下:
VS2022→创建新项目→Windows窗体应用(.NET Framework)→配置项目→设计Form1.cs和Form1.cs[设计](以上部分环节可选,具体因人、因事而不同)→鼠标选中右侧资源管理器项目名称,右键→添加,新建项→C#项,ADO.NET实体数据模型,添加→来自数据库的EF设计器,下一步→应用程序使用db_EMS.dbo与数据库建立连接,默认自动显现,连接字符串默认自动显现,默认√并默认把连接设置另存db_EMSEntities,下一步→实体框架6.x→选中表及dbo,选中在模型中包括外键列和将存储过程和函数导入到实体模型中,模型命名空间:db_EMSModel,默认。→完成。
安装完成后,右侧资源管理器增加了Model1.edmx和packages.config。
二.设计窗体和EF应用
对上述已创建的EF实体数据模型,通过EF对数据表进行增删改查操作。
1.窗体设计
2.应用程序设计
包括对数据表tb_stock所有记录的查询;以商品编号为主键对tb_stock没有的记录,用Add()方法增加新的记录,Add()方法增加记录影响SQL结果;以商品编号为主键对tb_stock已有的记录,用Attach()方法修改已有记录其余项目,Attach()方法只能修改EF实体记录,不影响SQL结果;用Remove()删除选中的记录,Remove()方法删除记录影响SQL结果;
3.源码
//Form1.cs
//通过EF对数据表进行增删改查操作。
//不需要程序建立对SQL的连接
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace _11
{public partial class Form1 : Form{public Form1(){InitializeComponent();}string strID = "";//记录选中的商品编号/// <summary>/// 初始化Form1/// </summary>private void Form1_Load(object sender, EventArgs e){groupBox1.Text = "设置商品信息";label1.Text = "商品编号:";label2.Text = "商品名称:";label3.Text = "单位:";label4.Text = "商品规格:";label5.Text = "商品型号:";label6.Text = "产 地:";label7.Text = "最近进价:";label8.Text = "库存数量:";button1.Text = "添加";button2.Text = "修改";button3.Text = "删除";toolStripMenuItem1.Text = "删除";comboBox1.Size = new System.Drawing.Size(40,21);textBox1.Size = new Size(145, 21);textBox2.Size = new Size(145, 21);textBox3.Size = new Size(145, 21);textBox4.Size = new Size(145, 21);textBox5.Size = new Size(145, 21);textBox6.Size = new Size(145, 21);textBox7.Size = new Size(145, 21);dataGridView1.AllowUserToAddRows = true;dataGridView1.AllowUserToDeleteRows = true;dataGridView1.AllowUserToResizeColumns = false;dataGridView1.AllowUserToResizeRows = false;dataGridView1.ReadOnly = false;dataGridView1.RowHeadersVisible = false;dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;dataGridView1.ContextMenuStrip = contextMenuStrip1;button3.ContextMenuStrip = contextMenuStrip1;comboBox1.Items.AddRange(new object[] { "台", "部", "个", "本", "件", "套" });using (db_EMSEntities db_ = new db_EMSEntities()){dataGridView1.DataSource = db_.tb_stock.ToList(); //显示数据表中所有信息}}/// <summary>/// 增加数据表tb_stock的记录/// 增加记录即原表中没有的商品编号/// </summary>private void Button1_Click(object sender, EventArgs e){using (db_EMSEntities db_ = new db_EMSEntities()){tb_stock _Stock = new tb_stock //为tb_stock类中的商品实体赋值{ tradecode = textBox1.Text, //商品编号fullname = textBox2.Text, //商品全称unit = comboBox1.Text, //单位type = textBox4.Text, //商品型号standard = textBox3.Text, //商品规格produce = textBox5.Text, //产地qty = Convert.ToInt32(textBox7.Text), //库存数量price = Convert.ToDouble(textBox6.Text) //最近进价};db_.tb_stock.Add(_Stock); //将stock记录添加到SQL数据表tb_stockdb_.SaveChanges(); //保存修改dataGridView1.DataSource = db_.tb_stock.ToList();//重新绑定数据源,更新dataGridView1}}/// <summary>/// 修改数据表tb_stock选中记录/// 修改记录对原表中即有行编号的记录其余项的修改/// Attach()只修改EF实体,不影响SQL/// </summary>private void Button2_Click(object sender, EventArgs e){using (db_EMSEntities db_ = new db_EMSEntities()){tb_stock _Stock = new tb_stock //重新为各个字段复制{tradecode = textBox1.Text,fullname = textBox2.Text,unit = comboBox1.Text, type = textBox4.Text,standard = textBox3.Text,produce = textBox5.Text,qty = Convert.ToInt32(textBox7.Text),price = Convert.ToDouble(textBox6.Text),};db_.tb_stock.Attach(_Stock); //Attach()只修改EF实体,不影响SQL/*db_.tb_stock.Remove(_Stock);*/ //可选,对.Attach后的记录执行删除,影响SQLdb_.SaveChanges(); //保存修改dataGridView1.DataSource = db_.tb_stock.ToList();//重新绑定数据源,更新dataGridView1} }/// <summary>/// 当鼠标选中dataGridView1某cell行时,控件Text同步查询各cell内容/// </summary>private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e){if (e.RowIndex>0) //判断是否选择了行{ strID = Convert.ToString(dataGridView1[0, e.RowIndex].Value).Trim(); //获取选中的商品编号using (db_EMSEntities db_ = new db_EMSEntities()){ tb_stock _Stock = db_.tb_stock.Where(W => W.tradecode == strID).FirstOrDefault(); //获取指定编号的商品信息textBox1.Text = _Stock.tradecode; //显示商品编号textBox2.Text = _Stock.fullname; //显示商品全称comboBox1.Text = _Stock.unit; //显示商品单位textBox4.Text = _Stock.type; //显示商品类型textBox3.Text = _Stock.standard; //显示商品规格textBox5.Text = _Stock.produce; //显示商品产地textBox7.Text = _Stock.qty.ToString(); //显示商品数量textBox6.Text = _Stock.price.ToString(); //显示商品价格}}}/// <summary>/// 删除数据表tb_stock选中行的记录/// 鼠标选中dataGridView1的任意cell,按下删除按钮,右键,执行删除。/// </summary>private void Button3_Click(object sender, EventArgs e){using (db_EMSEntities db_ = new db_EMSEntities()){tb_stock _Stock = db_.tb_stock.Where(W => W.tradecode == strID).FirstOrDefault();//查找要删除的记录if (_Stock != null) //判断要删除的记录是否存在{db_.tb_stock.Remove(_Stock); //构造删除SQL语句db_.SaveChanges(); //执行删除操作dataGridView1.DataSource = db_.tb_stock.ToList(); //重新绑定数据源MessageBox.Show("商品信息删除成功");}elseMessageBox.Show("请选择要删除的商品!");}}/// <summary>/// 删除数据表tb_stock选中行的记录/// 鼠标选中dataGridView1的任意cell,右键,执行删除。/// </summary>private void ToolStripMenuItem1_Click(object sender, EventArgs e){using (db_EMSEntities db_ = new db_EMSEntities()){tb_stock _Stock = db_.tb_stock.Where(W => W.tradecode == strID).FirstOrDefault();//查找要删除的记录if (_Stock != null) //判断要删除的记录是否存在{db_.tb_stock.Remove(_Stock); //构造删除SQL语句db_.SaveChanges(); //执行删除操作dataGridView1.DataSource = db_.tb_stock.ToList(); //重新绑定数据源MessageBox.Show("商品信息删除成功");}elseMessageBox.Show("请选择要删除的商品!");}}}
}
4.生成效果
(1)查询
鼠标任意点中dataGridView1的cell上,其上文本控件同步显示tb_stock记录的内容。
(2)修改
对文本显示控件的内容进行的修改,Attach()方法修改记录仅改变EF实体模型,不能影响SQL数据表。
图中,文本控件在Attach()方法修改前后数值不变(鼠标点击ataGridView1的其他cell处就恢复),其内容保持SQL数据表tb_stock不变。而下方dataGridView1的EF实体模型里内容已经被修改了。Attach()方法对EF实体模型的修改,只驻留在内存里,当关闭项目和再重启项目后消失不见。
(3)删除
用.RemoveAdd()对数据表tb_stock中不存在的记录进行增加,已主键为检索依据。
删除上图的T1002记录。
下方dataGridView1的EF实体模型里已经不见了T1002记录。
更新SQL,发现tb_stock里也不见了T1002记录。
(4)增加
用Add()对数据表tb_stock中不存在的记录进行增加,已主键为检索依据。
对上图再增加T1009记录:台式商用机、ZHAN99、I316G512M、合肥、12台、2488。
更新SQL,发现tb_stock里增加了T1009记录。
5.总结
无论如本文使用的通过选中dataGridView1的EF实体模型的cell单元,通过Add()、Attach()、Remove()等方法操作SQL数据表,还是通过编程的方法,在程序中对指定的数据表单位元进行读写,都存在共同的规律:
- 创建EF实体模型的对象,比如:db_;
- 创建实体模型中数据表的对象,比如:_Stock,这个对象就是一个结构体,对其内部成员及成员函数进行赋值操作、查询操作,等;
- 构造访问SQL的语句,比如:Add()、Attach()、Remove()等;
- 更新SQL数据库,比如:SaveChanges(),等;
- 可选,重新更新到dataGridView1,比如:dataGridView1.DataSource = db_.tb_stock.ToList();实质是SQL更新后,其结果同步映射到EF实体模型,然后再显示到dataGridView1。