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

news2024/11/20 2:38:10

目录

一、创建实体数据模型

1.建立数据库连接

2.建立EF实体模型

二.设计窗体和EF应用

1.窗体设计

2.应用程序设计

3.源码

4.生成效果

(1)查询

(2)修改

(3)删除

(4)增加


        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 _11;
using System;
using System.Collections;
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;
using System.Xml.Linq;

namespace WindowsFormsApp4
{
    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 = "删除";

            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;

            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_stock
                db_.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后的记录执行删除,影响SQL
                db_.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选中行的记录
        /// </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("商品信息删除成功");
                }
                else
                    MessageBox.Show("请选择要删除的商品!");
            }
        }
    }


}

4.生成效果

(1)查询

        鼠标任意点中dataGridView1的cell上,其上文本控件同步显示tb_stock记录的内容。

 

(2)修改

        对文本显示控件的内容进行的修改,Attach()方法修改记录仅改变EF实体模型,不能影响SQL数据表

         图中,文本控件在Attach()方法修改前后数值不变(鼠标点击其他任何处就恢复),其内容保持SQL数据表tb_stock不变。而下方dataGridView1的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记录。 

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

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

相关文章

Python 文件打包成可执行文件

打包 要将Python脚本打包成可执行文件&#xff0c;常见的做法是使用PyInstaller或cx_Freeze工具。下面是使用PyInstaller的基本步骤&#xff1a; 使用conda安装pyinstaller &#xff08;建议&#xff09; conda install -c conda-forge pyinstaller上面的命令从conda-forge通…

基于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;…

sd卡的坏块管理与负载均衡

坏块管理 坏块是指在存储介质中出现物理损坏或不可靠的数据块。由于SD卡使用的是闪存技术&#xff0c;它也面临着坏块的问题。 SD卡通过实现坏块管理机制来处理坏块。具体的坏块管理方法可能因制造商和产品型号而有所不同&#xff0c;但通常会采取以下策略&#xff1a; 坏块标…

打卡go学习第一天

8.1 下面展示一些 代码。 package mainimport ("fmt""net""os""time" )type Clock struct {Name stringAddr string &#xff5d; func main() {clocks : []Clock{{Name: "New York", Addr: "localhost:8000"…

笔记39:在Pycharm中为项目添加新解释器

很久不用pycharm都生疏了 a a a 第一步&#xff1a;创建虚拟环境 略 a a a 第二步&#xff1a;将虚拟环境应用到项目中去 【File】----【Settings】----【Project:~~~】-----【Project Interpreter】----【选择合适的解释器】 ​​​​​​​ 因为我们要用新的解释…

【OpenCV概念】 11— 对象检测

一、说明 这都是关于物体识别的。物体识别是指通过计算机视觉技术&#xff0c;自动识别图像或视频中的物体及其属性和特征&#xff0c;是人工智能领域的一个分支。物体识别可应用于多个领域&#xff0c;包括工业自动化、智能家居、医疗、安防等。请随时阅读这篇文章&#xff1a…

摩尔信使MThings的实时数据曲线

摩尔信使MThings配备了毫秒级的实时数据录波功能&#xff0c;提供了多种展示模式&#xff0c;包括&#xff1a;固定时间范围、示波器等&#xff1b; 用户可以添加实时数据警戒线&#xff0c;直观呈现异常数据&#xff1b; 用户可以灵活的缩放、拖动曲线数据&#xff0c;可以指…

nodejs+vue衣服穿搭推荐系统-计算机毕业设计

模块包括主界面&#xff0c;系统首页、个人中心、用户管理、风格标签管理、衣服分类管理、衣服穿搭管理、服装信息管理、我的搭配管理、用户反馈、系统管理等进行相应的操作。无论是日常生活&#xff0c;还是特定场景&#xff0c;诸如面试、约会等&#xff0c;人们都有展现自我…

【试题028】C语言关于逻辑与的短路例题

1.题目&#xff1a;设inta1,b;&#xff0c;执行b0&&(a);后&#xff0c;变量a的值是&#xff1f; 2.代码解析&#xff1a; #include <stdio.h> int main() {//设inta1,b;执行b0&&(a);后&#xff0c;变量a的值是?int a 1, b;printf("表达式的值是…

【每日一题】根据规则将箱子分类

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;分类讨论 其他语言cpython3 写在最后 Tag 【分类讨论】【2023-10-20】 题目来源 2525. 根据规则将箱子分类 题目解读 题目意思明确&#xff0c;根据条件判断箱子的类别。 解题思路 方法一&#xff1a;分类讨论 根据…

Pyqt组合控件与QSpacerItem指南

Pyqt组合控件与QSpacerItem指南&#xff09; 组合控件效果如下所示&#xff1a; QSpacerItem详解 组合控件 创建一个组合的控件&#xff0c;比如 QCheckBox 和 QLabel&#xff0c;并为这个组合设置背景颜色&#xff0c;可以将它们放在一个容器小部件中&#xff0c;然后为容器小…

Leetcode——数组的旋转

189. 轮转数组 class Solution { public:void rotate(vector<int>& nums, int k) {int lennums.size();vector<int> num(len);for(int i0;i<len;i){num[(ik)%len]nums[i];}nums.assign(num.begin(),num.end());} };旋转数组 没看出数学公式gg 正确答案 cl…

经典文献阅读之--Calib Anything(使用SAM的无训练标定雷达相机外参)

0. 简介 Camera与LiDAR之间的外部标定研究正朝着更精确、更自动、更通用的方向发展&#xff0c;由于很多方法在标定中采用了深度学习&#xff0c;因此大大减少了对场景的限制。然而&#xff0c;数据驱动方法具有传输能力低的缺点。除非进行额外的训练&#xff0c;否则它无法适…

安卓Ampere Pro(充电评测)v4.09解锁专业版,供大家学习研究参考!

软件功能 支持查看充电的状态&#xff0c;充电速度是否正常&#xff0c;都可以轻松测试。 强大的测试功能&#xff0c;让你全面了解充电的状态。 温度过高提醒&#xff0c;保证手机的温度不过高&#xff0c;及时拔掉电源。 设置通知优先级&#xff0c;最高、较高、默认、较…

Zookeeper集群 + Kafka集群的详细介绍与部署

文章目录 1. Zookeeper 概述1.1 简介1.2 Zookeeper的工作机制1.3 Zookeeper 主要特点1.4 Zookeeper 数据结构1.5 Zookeeper的相关应用场景1.5.1 统一命名服务1.5.2 统一配置管理1.5.3 统一集群管理1.5.4 服务器动态上下线1.5.5 软负载均衡 1.6 Zookeeper 选举机制1.6.1 第一次启…

SI基础知识:说一说玻纤布规格(如1078)的具体含义,以及等效Dk计算

玻纤布的编织包含经向和纬向两个不同的方向&#xff0c;这些玻璃布并没有被紧密放置在一起&#xff0c;在玻纤布上会有开窗&#xff0c;而且经向开窗和纬向开窗大小不同。 IPC定义了每种玻纤布的编织密度以及所用玻璃丝的规格&#xff0c;如下图所示。 看上面的表格&#xff0c…

Fast DDS之Subscriber

目录 SubscriberSubscriberQosSubscriberListener创建Subscriber DataReaderSampleInfo读取数据 Subscriber扮演容器的角色&#xff0c;里面可以有很多DataReaders&#xff0c;它们使用Subscriber的同一份SubscriberQos配置。Subscriber可以承载不同Topic和数据类型的DataReade…

【算法学习】归并算法Merge Sort总结

归并排序思路简单&#xff0c;速度仅次于快速排序&#xff0c;为稳定排序算法&#xff0c;一般用于对总体无序&#xff0c;但是各子项相对有序的数列。 1. 基本思想 归并排序使用分治思想&#xff0c;分治模式下每一层递归有三个步骤&#xff1a; 分解&#xff08;divide)&a…

1813_ChibiOS的RT系统层

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 在ChibiOS中有一个RT系统层的部分&#xff0c;也就是内核的系统层。这个在其他的OS中是没有看到的&#xff0c;这里针对这一部分做一个简单的认识。…

送水订水商城小程序的作用是什么

无论瓶装水还是桶装水在市场中的需求度总是很高&#xff0c;相关送水公司或零售水企业也不少&#xff0c;消费者的购物方式一般是品牌直售或通过经销商&#xff0c;零售水则是超市/商场等场景。随着人们健康品质生活提升&#xff0c;家庭或办公等场所对桶装水或瓶装水的需求日益…