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.rhkb.cn/news/165035.html

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

相关文章

Ubuntu桌面环境的切换方法

你在找它吗&#xff1f; 国内麒麟、深度等系统虽然界面更炫&#xff0c;但——软件仓库与Ubuntu官方已不兼容。国内系统遇到稳定性问题&#xff0c;还是得拿Ubuntu做参照。今天本来介绍下这款Linux桌面。 为什么在 Ubuntu 上考虑 LXQt&#xff1f; 性能&#xff1a;LXQt设计为…

Uniapp软件库源码 全新带勋章功能(包含前后端源码)

Uniapp软件库全新带勋章功能&#xff0c;搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名&#xff0c; 电脑需要下载&#xff1a;HBuilderX 登录账号 没有账号就注册账号&#xff0c;然后上传文件&#xff0c;打包选择 “发行” 可以打包app h5等等。…

【TES600】青翼科技基于XC7K325T与TMS320C6678的通用信号处理平台

板卡概述 TES600是一款基于FPGA&#xff0b;DSP协同处理架构的通用高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多核浮点/定点DSP TMS320C6678作为主处理单元&#xff0c;采用1片Xilinx的Kintex-7系列FPGA XC7K325T作为协处理单元&#xff0c;具有1个FMC…

Youtrack Linux 安装

我们考虑最后应该使用的是 ZIP 方式的安装。 按照官方的说法如何设置运行 YouTrack 应该是非常简单的。 准备环境 根据官方的说法&#xff0c;我们需要做的就是下载 Zip 包&#xff0c;然后把 Zip 包解压到指定的目录中就可以了。 下载 当前官方的下载地址为&#xff1a;Ge…

Docker(五)、容器间数据共享~volume

容器间数据共享&#xff5e;volume 一、简单了解二、有两种通过命令设置数据卷的方法一&#xff09;、方式1. 通过 -v 挂载宿主机目录1、格式2、浅实践下 二&#xff09;、方式2.实现形式&#xff1a;通过共享容器内挂载点--volumes-from&#xff0c;其他容器指定此挂载点1、格…

【计算机毕设选题推荐】口腔助手小程序SpringBoot+Vue+小程序

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的口腔助手小程序 技术栈 SpringBootVue小程序MySQLMaven 文章目录 一、口腔…

java-各种成员变量初始化过程-待完善

前置条件 一、本文章讨论的成员变量 public static final String aa "aa";public static final Integer bb 1;public static final Students cc new Students();public static String aa1 "aa";public static Integer bb1 1;public static String bb2…

MySQL基本操作之修改表结构

1、末尾增加字段 在表结构末尾增加一个名为 beizhu 的字段,类型为 varchar(250),并添加注释 trie: ALTER TABLE student ADD beizhu VARCHAR(250) COMMENT trie; 2、在表结构开头增加一个名为 xxx 的字段,类型为 varchar(20): ALTER TABLE student ADD xxx VARCHAR(20)…

Redis在分布式场景下的应用

分布式缓存 缓存的基本作用是在高并发场景下对应服务的保护缓冲 – 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; redis由于高强度性能采用内存 但是意味着丢失的风险单结点redis并发能力有限分布式服务中数据过多 依赖内存的redis 明显单机不…

深度学习技巧应用29-软件设计模式与神经网络巧妙结合,如何快速记忆软件设计模式

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下软件设计模式与神经网络巧妙结合&#xff0c;如何快速记忆软件设计模式。我们知道软件设计模式有23种&#xff0c;考试的时候经常会考到&#xff0c;但是这么种里面我们如何取判断它呢&#xff0c;如何去记忆它呢&a…

Day5力扣打卡

打卡记录 对角线上不同值的数量差&#xff08;矩阵对角线遍历 前缀和&#xff09; 链接 思路&#xff1a;由于任意行 i 与 列 j&#xff0c;满足对角线上 i j t 的关系&#xff0c;t 的范围为 [1 - n, m - 1]&#xff0c;设 s t n&#xff0c;可以得到 s的范围为 [1, n …

uniapp接入萤石微信小程序插件

萤石官方提供了一些适用于uniapp / 小程序的方案 如 小程序半屏 hls rtmp 等 都TM有坑 文档写的依托答辩 本文参考了uniapp小程序插件 以及 萤石微信小程序插件接入文档 效果如下 1. 插件申请 登录您的小程序微信公众平台&#xff0c;点击左侧菜单栏&#xff0c;进入设置页…

盒式交换机堆叠配置

目录 1.配置环形拓扑堆叠 2.设备组建堆叠 3.设备组件堆叠 堆叠 istack&#xff0c;是指将多台支持堆叠特性的交换机设备组合在一起&#xff0c;从逻辑上组合成一台交换设备。如图所示&#xff0c;SwitchA与 SwitchB 通过堆叠线缆连接后组成堆叠 istack&#xff0c;对于上游和…

电流监测芯片SGM8199A2应用电路设计

SGM8199是一系列具有电压输出功能的双向电流监测芯片&#xff0c;用于监测共模电压范围内分流电阻上的压降&#xff0c;而不受电源电压的影响。该器件具有-0.1V至26V的宽共模电压范围输入。低偏移使得在监测电流时允许分流器上的满量程最大压降为10mV。SGM8199系列提供三种固定…

基于SSM的培训学校教学管理平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

网站批量替换关键词方法

注意替换操作之前先对文件做好备份 1.下载http://downinfo.myhostadmin.net/ultrareplace5.02.rar 解压出来,运行UltraReplace.exe 2.点击菜单栏中的配置&#xff0c;全选所有文件类型,或者根据自己的需求选择部分,如htm、html、php、asp等 3.若替换单个文件,点击文件,若是要…

液氮罐在科研实验中的重要作用与优化方案

在科研实验中&#xff0c;液氮罐扮演着极其重要的角色。液氮罐是一种用于储存和传输液氮的设备&#xff0c;其低温特性使得它成为许多实验室的必备工具。本文将探讨液氮罐在科研实验中的重要作用以及优化方案。 首先&#xff0c;液氮罐在科研实验中的重要作用之一是保存生物样…

论文阅读 | RAFT: Recurrent All-Pairs Field Transforms for Optical Flow

RAFT: Recurrent All-Pairs Field Transforms for Optical Flow ECCV2020光流任务best paper 论文地址&#xff1a;【here】 代码地址&#xff1a;【here】 介绍 光流是对两张相邻图像中的逐像素运动的一种估计。目前碰到的一些困难包括&#xff1a;物体的快速运动&#xff…

MIT6.S081Lab1: Xv6 and Unix utilities

MIT6.S081 Lab1&#xff1a; Xv6 and Unix utilities 官方文档 一.Boot xv6 如何成功的boot xv6可以看之前的文章MIT6.S081实验环境搭建&#xff0c;只是多一个步骤&#xff0c;在clone的文件夹中执行 git checkout util切换为util分支即可。 二.sleep 在user/sleep.c中编…

排序算法可视化

前言 这两天在B站上刷到一个视频&#xff0c;用python把各种排序动画可视化显示了出来觉得还蛮好玩的&#xff0c;当即就决定用Flutter写一个玩玩&#xff0c;顺便复习一下排序算法&#xff0c;话不多说&#xff0c;进入正文~ 效果图&#xff1a; 该效果图为鸡尾酒排序(双向冒…