C#中.NET 7.0 Windows窗体应用通过EF访问已有数据库并实现追加、删除、修改、插入记录
目录
一、前言
1.Database.ExecuteSqlCommand 方法不被EF7.0支持
2.SET IDENTITY_INSERT Blog {ON,OFF}不起作用
3.主键和标识列分离,成功实现插入与修改
二、新建本文涉及的项目
三、程序设计
1.Form1.cs源码
2.Form1.cs[设计]
四、生成和测试
1.原始表
2.空内容追加
3.有内容追加、删除记录ID=2、插入记录ID=3
4.插入记录ID=33
5.修改记录ID=31
五、后记
一、前言
在发布这篇文章之前,先说一下作者为了实现通过EF修改已有数据库记录和在任意空位置插入数据库记录所做过的一些尝试,做这些尝试很累甚至一度失望。因为EF已经更新到7.0(刚刚又更新到了8.0),EF7相对于EF6之前的版本有了一些改变,甚至放弃了一些不安全的对数据库操作的函数,缺少经验的人在不知道到的情况下,继续使用那些在EF7以后的版本不再支持的函数,找不到原因的时候是很崩溃的。现在总结一下在写本文时遭遇的EF6函数不再被EF7支持的“花絮”。
我的环境:VS2022,Windows窗体应用,.NET 7.0,NuGet程序包:microsoft.entityframeworkcore.7.0.14、microsoft.entityframeworkcore.design.7.0.14、microsoft.entityframeworkcore.relational.7.0.14、microsoft.entityframeworkcore.sqlserver.7.0.14、microsoft.entityframeworkcore.tools.7.0.14。
数据库:Blogging 。
1.Database.ExecuteSqlCommand 方法不被EF7.0支持
| 严重性 | 代码 | 说明 | 项目 | 文件 | 行 | 禁止显示状态 |
| 错误 | CS1061 | “DatabaseFacade”未包含“ExecuteSqlCommand”的定义,并且找不到可接受第一个“DatabaseFacade”类型参数的可访问扩展方法“ExecuteSqlCommand”(是否缺少 using 指令或程序集引用?) | 10_10 | C:\Users\YCZN_MT\Desktop\10_10\10_10\Form1.cs | 71 | 活动 |
在db.Database.后面的方法里根本就找不到ExecuteSqlCommand()了。
2.SET IDENTITY_INSERT Blog {ON,OFF}不起作用
db.Database.ExecuteSql($"SET IDENTITY_INSERT Blog ON")
对数据库记录的写入操作
db.Database.ExecuteSql($"SET IDENTITY_INSERT Blog OFF")
以上组合根本就不起作用,网络上的 db.Database.ExecuteSqlCommand ()各种经验因为不被.NET 7.0支持,即使替换上 db.Database.ExecuteSql()也不起作用,在 db2.SaveChanges()处就停下来了,根本就不能将数据写入数据库。无法改变标识列的开与关。
提示“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 ' Blog' 中的标识列插入显式值。”
3.主键和标识列分离,成功实现插入与修改
当主键和IDENTITY列是同一列时,由于EF7废弃了Database.ExecuteSqlCommand ()方法,致使无法在C#中编程实现对SET IDENTITY_INSERT Blog ON或OFF。SQL里的标识列始终起作用,SQL不接受插入不存在记录和修改数据已有记录。
采用主键和IDENTITY列分离,新增加一个列作为标识列,起辅助作用,用途只为了实现插入和修改记录。
采用主键和IDENTITY列分离后,依赖原来的IDENTITY列的追加功能,需要用编程的方法,对BlogId字段进行赋值,本文采用的赋值算法是:BlogId=InsertId-1,即BlogId始终等于上一条记录的IDENTITY值。
下面发布正文:
二、新建本文涉及的项目
由于作者前期的文章关于这一步都有涉及,因此,此处只写过程的操作摘要:
VS2022,新建Windows窗体应用,.NET 7.0,NuGet程序包版本7.0.14→工具、连接到数据库,Blogging → 逆向工程,生成EF实体模型及数据库上下文→设计Form1.cs[设计]和Form1.cs→生成测试。
其中:PM> Scaffold-DbContext "Server=DESKTOP-3LV13FS;Database=Blogging;Trusted_Connection=True;TrustServerCertificate=true;integrated security=SSPI;" Microsoft.EntityFrameworkCore.SqlServer
数据库更新时:PM> Scaffold-DbContext-Force "Server=DESKTOP-3LV13FS;Database=Blogging;Trusted_Connection=True;TrustServerCertificate=true;integrated security=SSPI;" Microsoft.EntityFrameworkCore.SqlServer
三、程序设计
1.Form1.cs源码
//Form1.cs
//EF7对已有数据库增加、删除、修改、插入
using System.Data;namespace _10_10
{public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 初始化Form1/// 初始化表格,显示数据表/// </summary>#region Form1_Loadprivate void Form1_Load(object sender, EventArgs e){button1.Text = "追加";button2.Text = "删除";button3.Text = "插入/覆盖";label1.Text = "追加的Url:";label2.Text = "删除的ID:";label3.Text = "插入记录:";button1.Size = new Size(40, 23);button2.Size = new Size(40, 23);textBox2.Size = new Size(30, 23);textBox3.Size = new Size(30, 23);textBox4.Size = new Size(125, 23);dataGridView1.AllowUserToAddRows = false;dataGridView1.AllowUserToDeleteRows = false;dataGridView1.AllowUserToResizeColumns = false;dataGridView1.AllowUserToResizeRows = false;dataGridView1.RowHeadersVisible = false;dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;using var db = new BloggingContext();dataGridView1.DataSource = db.Blogs.ToList();}#endregion Form1_Load/// <summary>/// 追加Add()/// 无论ID是否连续,都在数据库末尾追加新纪录/// </summary>#region 追加记录private void Button1_Click(object sender, EventArgs e){int _rows = dataGridView1.Rows.Count;using var db = new BloggingContext();if (textBox1.Text != ""){ var table = new Blog{BlogId = Convert.ToInt32(dataGridView1.Rows[_rows - 1].Cells[2].Value.ToString()),Url = textBox1.Text.Trim().ToString()};db.Blogs.Add(table); //追加记录db.SaveChanges();dataGridView1.DataSource = db.Blogs.ToList();}else{var table = new Blog{BlogId = Convert.ToInt32(dataGridView1.Rows[_rows-1].Cells[2].Value.ToString()),Url = "http://www.hao123.com/"}; db.Blogs.Add(table);//追加记录db.SaveChanges();dataGridView1.DataSource = db.Blogs.ToList();}}#endregion 追加记录/// <summary>/// 删除Remove()/// </summary>#region 删除记录private void Button2_Click(object sender, EventArgs e){if (textBox2.Text != string.Empty){using var db = new BloggingContext();var data = (from tb in db.Blogs where tb.BlogId == Convert.ToInt32(textBox2.Text.Trim()) select tb).FirstOrDefault(); //判断数据表中是否包含要删除的IDif (data != null){using var db2 = new BloggingContext();var tableNew = new Blog{BlogId = Convert.ToInt32(textBox2.Text.Trim())};db2.Blogs.Remove(tableNew); //删除记录按IDdb2.SaveChanges();dataGridView1.DataSource = db2.Blogs.ToList();}else{MessageBox.Show("数据表中没有这个ID,请重新输入", "提示");}}else{MessageBox.Show("请输入要删除记录的编号", "提示");}}#endregion 删除记录/// <summary>/// 插入或覆盖/// 要插入的ID存在则覆盖原纪录;/// 要插入的ID不存在则添加记录;/// Linq无法直接更新主键的数据,只能是先将此条信息复制出来,把原来的那条数据删除,/// 再重新插入一条修改后的数据,若不是主键数据,则直接更新/// </summary>#region 插入或覆盖记录private void Button3_Click(object sender, EventArgs e){if (textBox3.Text.Trim() == string.Empty){MessageBox.Show("ID不能为空,请重新输入","提示");}else{using var db = new BloggingContext();//db.Database.ExecuteSql($"SET IDENTITY_INSERT Blog ON"); var data = (from tb in db.Blogswhere tb.BlogId == Convert.ToInt32(textBox3.Text.Trim())select tb).FirstOrDefault();//判断数据表中是否包含要插入的IDif (data != null){using var db2 = new BloggingContext();//db2.Database.ExecuteSql($"SET IDENTITY_INSERT Blog ON");var tableNew = new Blog{BlogId = Convert.ToInt32(textBox3.Text.Trim()),Url = textBox4.Text.Trim().ToString()}; db2.Blogs.Remove(data); //移除老数据 db2.Blogs.Add(tableNew); //添加新数据db2.SaveChanges(); //执行更新操作//db2.Database.ExecuteSql($"SET IDENTITY_INSERT Blog OFF");dataGridView1.DataSource = db2.Blogs.ToList();}else{using var db2 = new BloggingContext();//db2.Database.ExecuteSql($"SET IDENTITY_INSERT Blog ON");var table = new Blog{BlogId = Convert.ToInt32(textBox3.Text.Trim()),Url = textBox4.Text.Trim().ToString()};db2.Blogs.Add(table); //执行插入操作db2.SaveChanges();//db2.Database.ExecuteSql($"SET IDENTITY_INSERT Blog OFF");dataGridView1.DataSource = db2.Blogs.ToList();}//db.Database.ExecuteSql($"SET IDENTITY_INSERT Blog OFF");} }#endregion 插入或覆盖记录}
}
2.Form1.cs[设计]

四、生成和测试
1.原始表

2.空内容追加

3.有内容追加、删除记录ID=2、插入记录ID=3、35

4.插入记录ID=33

5.修改记录ID=31

五、后记
本文所使用的主键和标识列分离的方法实现对数据库已有记录的修改,不存在的记录的插入操作,仅代表作者的一种实现方法,不代表是唯一的实现方法。也许读者们有更好的实现办法。希望在日后的工作中此方面能与读者共勉共研。
相关文章:
C#中.NET 7.0 Windows窗体应用通过EF访问已有数据库并实现追加、删除、修改、插入记录
目录 一、前言 1.Database.ExecuteSqlCommand 方法不被EF7.0支持 2.SET IDENTITY_INSERT Blog {ON,OFF}不起作用 3.主键和标识列分离,成功实现插入与修改 二、新建本文涉及的项目 三、程序设计 1.Form1.cs源码 2.Form1.cs[设计] 四、生成和测试 1.原始表 …...
【文末送书】计算机网络 | IO多路转接技术 | poll/epoll详解
欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…...
【Linux】 uptime命令使用
uptime 正常运行时间提供以下信息的单行显示。当前时间、系统运行的时间、当前登录的用户数量以及过去1、5和15分钟的系统平均负载。 语法 uptimeuptime命令 -Linux手册页 作者 由Larry Greenfield编写和迈克尔K约翰逊编写。 命令选项及作用 执行令 man uptime 执行命令结…...
数学建模-图与网络模型解题方法和代码实现
本文针对以下几个方面问题进行整理: 最短路问题 两个指定顶点之间的最短路径任意顶点之间的最短路径 2.最小生成树问题 求最小生成树 3.网络最大流问题 源点与汇点之间的最大流基于最大流的最小费用求解 4.旅行商问题 基于哈密顿(Hamilton)圈求解旅行商线性…...
宏集新闻 | 虹科传感器事业部正式更名为宏集科技
致一直支持“虹科传感器”的朋友们: 为进一步整合资源,给您带来更全面、更优质的服务,我们非常荣幸地宣布,虹科传感器事业部已正式更名为宏集科技。这一重要的改变代表了虹科持续发展进程中的新里程碑,也体现了我们在传…...
DataFunSummit:2023年数据基础架构峰会-核心PPT资料下载
一、峰会简介 正如From、Join、排序等是SQL的基本算子,存储与计算是也是数据架构中数据生产与消费的基本算子,对于数据架构之下的技术栈层级,我们可将其定义为数据基础架构。 数据存储技术在适应大数据时代的规模需求基础之上,持…...
解析大型语言模型的训练、微调和推理的运行时性能
背景 这篇论文是截至目前为数不多的介绍大模型训练配套环境比对的论文,对于想要入门大模型训练同学是个不错的入门资料。比较了不同尺寸模型(比较常用的7、13、70b),在不同型号gpu、训练框架、推理框架数据。结合自己实际工作需要…...
MAX/MSP SDK学习06:内存管理
提供两种内存分配方式:①简单指针,②句柄(二级指针);官方文档建议使用前者。 // 简单指针 char *ptr; ptr sysmem_newptr(2000); post("I have a pointer %lx and it is %ld bytes in size",ptr, sysmem_p…...
python网络通信之基础知识填坑
文章目录 版权声明网络通信要素IP地址ifconfig和ping命令ifconfig (Interface Configuration)ping 端口和端口号的介绍端口号的分类socket介绍TCPTCP简介TCP的特点 UDPUDP简介UDP特点 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#…...
【腾讯云云上实验室-向量数据库】腾讯云开创新时代,发布全新向量数据库Tencent Cloud VectorDB
前言 随着人工智能、数据挖掘等技术的飞速发展,海量数据的存储和分析越来越成为重要的研究方向。在海量数据中找到具有相似性或相关性的数据对于实现精准推荐、搜索等应用至关重要。传统关系型数据库存在一些缺陷,例如存储效率低、查询耗时长等问题&…...
【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV4)模型算法详解
【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV4)模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV4)模型算法详解前言GoogLeNet(InceptionV4)讲解Stem结构Inception-A结构Inception- B结构Inception-C结构Redution-A结构Re…...
opencv dots_image_kernel
1,opencv dots_image_kernel // halcon dots_image kernel估算(d5) cv::Mat getDotKernel(int d 5){// 保证d为正的奇数d | 0x01;cv::Mat kernel cv::Mat::zeros(d 2, d 2, CV_8UC1);int cx kernel.cols / 2;int cy kernel.rows / 2;int cnt255 0, cnt128 …...
使用pytorch利用神经网络原理进行图片的训练(持续学习中....)
1.做这件事的目的 语言只是工具,使用python训练图片数据,最终会得到.pth的训练文件,java有使用这个文件进行图片识别的工具,顺便整合,我觉得Neo4J正确率太低了,草莓都能识别成为苹果,而且速度慢,不能持续识别视频帧 2.什么是神经网络?(其实就是数学的排列组合最终得到统计结果…...
2023年中国合成云母行业现状及市场格局分析[图]
合成云母是一种通过化工原料经高温熔融冷却析晶而制得的单斜晶系矿物,属于典型的层状硅酸盐,许多性能都优于天然云母,如合成云母的耐温高达1200℃以上,而天然白云母在550℃下就会开始分解,金云母则在800℃开始分解。除…...
Vue3+Vite实现工程化,插值表达式和v-text以及v-html
1、插值表达式 插值表达式最基本的数据绑定形式是文本插值,它使用的是"Mustache"语法,即 双大括号{{}} 插值表达式是将数据 渲染 到元素的指定位置的手段之一插值表达式 不绝对依赖标签,其位置相对自由插值表达式中支持javascript的…...
艾泊宇产品战略:灵感于鬼屋,掌握打造卓越用户体验的关键要素
在当今的商业环境中,用户体验已经成为产品成功的关键因素。 无论是线上产品还是实体产品,用户体验都是决定用户是否愿意使用和推荐该产品的关键因素。 那么,艾泊宇产品战略理论告诉大家,如何做好用户体验? 我们可以…...
深度学习环境配置(Anaconda+pytorch+pycharm+cuda)
NVIDIA驱动安装 首先查看电脑的显卡版本,步骤为:此电脑右击-->管理-->设备管理器-->显示适配器。就可以看到电脑显卡的版本了。 然后按照电脑信息,到地址 去安装相应的驱动,Notebooks是笔记本的意思,然后下…...
不是说人工智能是风口吗,那为什么工作还那么难找?
最近确实有很多媒体、机构渲染人工智能可以拿高薪,这在行业内也是事实,但前提是你有足够的竞争力,真的懂人工智能。 首先,人工智能岗位技能要求高,人工智能是一个涵盖了多个学科领域的综合性学科,包括数学、…...
new Vue() 发生了什么
前言: 在Vue.js中,当你创建一个新的Vue实例时,通过 new Vue() 发生了一系列重要的操作,包括Vue实例的初始化、数据绑定、模板编译等。这个过程是Vue应用的核心,本文将深入探讨new Vue()发生了什么以及其原理,提供示例…...
【算法】二叉树的存储与遍历模板
二叉树的存储与遍历 const int N 1e6 10;// 二叉树的存储,l数组为左节点,r数组为右结点 int l[N], r[N]; // 存储节点的数据 char w[N]; // 节点的下标指针 int idx 0;// 先序创建 int pre_create(int n) {cin >> w[n];if (w[n] #) return -1;l[n] pre_create(idx)…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
