C#通过Entity Framework实体对数据表增删改查

目录

一、创建实体数据模型

1.建立数据库连接

2.建立EF实体模型

二.设计窗体和EF应用

1.窗体设计

2.应用程序设计

3.源码

4.生成效果

(1)查询

(2)修改

(3)删除

(4)增加

5.总结


        Entity Framework(以下简写为 EF )是微软官方发布的 ORM 框架,它是基于 ADO.NET 的,通过 EF 可以很方便地将表映射到实体对象或将实体对象转换为数据库表。

一、创建实体数据模型

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标准盒子模型,与怪异盒子模型详解

目录 简介&#xff1a; 1. 标准盒子模型 2. 怪异盒子模型 3. 标准盒子模型与怪异盒子模型的差异 4. 如何设置盒子模型 5. 怪异盒子模型在实际开发中的应用 6. 总结 简介&#xff1a; 盒子模型是前端开发中的一个基本概念&#xff0c;它定义了Web页面上的每个元素&#…

Unigui中获取手机特征码

在Delphi Unigui中&#xff0c;您可以使用TUniDeviceInfo类来读取设备的一些基本信息&#xff0c;例如设备的操作系统版本、设备名称和分辨率等。但是&#xff0c;TUniDeviceInfo类并不提供设备的特征码信息。 如果您想要获取设备的特征码信息&#xff0c;您可以使用JavaScrip…

关于 XSS 漏洞的测试

XSS 的简介 XSS(Cross-Site Scripting)跨站脚本攻击&#xff0c;是一种常见的网络安全漏洞&#xff0c;指攻击者将恶意脚本注入到网页中&#xff0c;然后这些脚本在用户的浏览器中执行。这种攻击通常发生在基于 Web 的应用程序中&#xff0c;如网站和 web 应用程序&#xff0c…

sqlmap防御以及文件读写

一.防御 过滤 1.使用过滤函数 $email filter_var($_POST[email], FILTER_VALIDATE_EMAIL); if ($email) { // input is a valid email address } else { // input is not a valid email address 使用 filter_var() 函数和 FILTER_VALIDATE_EMAIL 过滤器来验证用户输…

[AUTOSAR][诊断管理][$11] 复位服务

文章目录 一、简介(1) 应用场景&#xff08;2&#xff09; 请求格式&#xff08;3&#xff09; 重启类型 二、示例代码(1) 11_ecu_reset.c 一、简介 ECU复位服务就是可以此诊断指令来命令ECU执行自复位&#xff0c;复位有多种形式&#xff0c;依据子功能参数来区分&#xff08…

Excel函数中单元格的引用方式

如下图在D列第一行输入sum(A1:C1)&#xff1b; 回车之后结果如下&#xff1b;先要输入等号&#xff0c;然后输入sum&#xff0c;以及左括号&#xff0c;这是调用了sum求和函数&#xff1b; A1表示A列第一行&#xff0c;C1表示C列第一行&#xff1b; A1:C1&#xff0c;中间是冒号…

数字图像处理实验记录五(图像的空间域增强-锐化处理)

前言&#xff1a; 文章目录 一、基础知识1&#xff0c;什么是锐化&#xff1f;2&#xff0c;为什么要锐化&#xff1f;3&#xff0c;怎么进行锐化&#xff1f; 二、实验要求任务1&#xff1a;任务2&#xff1a;任务3&#xff1a; 三、实验记录&#xff1a;任务1&#xff1a;任…

一步一步分析ChatGPT,1 粘性,2 传染性, 3 双边网络效应

请按照以下三个维度一步一步分析ChatGPT&#xff0c;1 粘性&#xff0c;2 传染性&#xff0c; 3 双边网络效应&#xff0c;比如亚马逊的买家和商家的关系 ChatGPT的分析 1.1. 粘性 (Stickiness) 定义&#xff1a; 粘性是指产品或服务对用户的吸引力&#xff0c;即用户在使用…

【Java 进阶篇】深入了解 Bootstrap 组件

Bootstrap 是一个流行的前端框架&#xff0c;提供了丰富的组件&#xff0c;用于创建各种网页元素和交互效果。这些组件可以帮助开发者轻松构建漂亮、响应式的网页&#xff0c;而无需深入的前端开发知识。在本文中&#xff0c;我们将深入探讨 Bootstrap 中一些常用的组件&#x…

自然语言处理---Transformer机制详解之ELMo模型介绍

1 ELMo简介 ELMo是2018年3月由华盛顿大学提出的一种预训练模型. ELMo的全称是Embeddings from Language Models.ELMo模型的提出源于论文<< Deep Contextualized Word Representations >>.ELMo模型提出的动机源于研究人员认为一个好的预训练语言模型应该能够包含丰…

TensorRT学习笔记--常用卷积、激活、池化和FC层算子API

目录 1--Tensor算子API 1-1--卷积算子 1-2--激活算子 1-3--池化算子 1-4--FC层算子 2--代码实例 3--编译运行 1--Tensor算子API TensorRT提供了卷积层、激活函数和池化层三种最常用算子的API&#xff1a; // 创建一个空的网络 nvinfer1::INetworkDefinition* network …

DataX-web安装部署和使用

DataX-web的环境准备 MySQL (5.5) 必选&#xff0c;对应客户端可以选装, Linux服务上若安装mysql的客户端可以通过部署脚本快速初始化数据库 JDK (1.8.0_xxx) 必选 DataX 必选 Python (2.x) (支持Python3需要修改替换datax/bin下面的三个python文件&#xff0c;替换文件在do…

飞书-多维文档-计算时间差

1. 选择字段类型 如图所示&#xff0c;字段类型选择 公式 2. 编辑公式 单击 公式编辑器 在弹出的公式编辑框中输入公式 TEXT([终结时间]-[开始时间],"HH:MM") [终结时间] 和 [开始时间] 请替换成你的表格中对应的字段名称HH:MM 表示输出的时间格式为 时:分其中 “…

【编解码格式】Sorenson系列

Sorenson Sorenson Media是一家专门从事视频编码技术的美国软件公司。Sorenson Vision 成立于 1995 年 12 月&#xff0c;该公司开发的技术获得了犹他州立大学的许可并最终获得。该公司于 1997 年 1 月在MacWorld Expo的开发者预览会上首次宣布其编解码器&#xff08;压缩和解…

黑豹程序员-架构师学习路线图-百科:Maven

文章目录 1、什么是maven官网下载地址 2、发展历史3、Maven的伟大发明 1、什么是maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and…

【算法挨揍日记】day16——525. 连续数组、1314. 矩阵区域和

525. 连续数组 525. 连续数组 题目描述&#xff1a; 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。 解题思路&#xff1a; 本题的元素只有0和1&#xff0c;根据题目意思&#xff0c;我们可以把题目看成找一段最…

通讯网关软件028——利用CommGate X2Modbus实现Modbus RTU访问PI服务器

本文介绍利用CommGate X2Modbus实现Modbus RTU访问PI数据库。CommGate X2MODBUS是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过Modbus RTU来获取PI数据库的数据。 【解决方案…

YOLOv8改进实战 | 更换主干网络Backbone(二)之轻量化模型GhostnetV2

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

基于nodejs+vue语言的酒店管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Visual Components软件有哪些用途 衡祖仿真

Visual Components是一款用于制造业虚拟仿真的软件&#xff0c;主要用于工业自动化和制造领域。我们一起来看一下该软件有哪些功能吧&#xff01; 1、工厂仿真 Visual Components可以建立虚拟的工厂环境&#xff0c;模拟和优化生产流程。用户可以创建工厂布局、定义设备和机器人…