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.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 ()因为不被支持,所以换上 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

4.插入记录ID=33

5.修改记录ID=31

五、后记

        本文所使用的主键和标识列分离的方法实现对数据库已有记录的修改,不存在的记录的插入操作,仅代表作者的一种实现方法,不代表是唯一的实现方法。也许读者们有更好的实现办法。希望在日后的工作中此方面能与读者共勉共研。

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

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

相关文章

基于GATK流程化进行SNP calling

在进行变异检测时&#xff0c;以群体基因组重测序数据为例&#xff0c;涉及到的个体基本都是上百个&#xff0c;而其中大多数流程均是重复的步骤。 本文将基于GATK进行SNP calling的流程写入循环&#xff0c;便于批量分析。 1 涉及变量 1.工作目录work_dir/ 2.参考基因组ref…

[Genode] ARM TrustZone

这是关于读文章ARM TrustZone的记录&#xff0c;原文是英文&#xff0c;刚开始会有点反应不过来&#xff0c;这里大部分是对文章的翻译与提取。 ARM信任区技术 ARM信任区是在 热烈讨论关于X86平台上的可信平台模块&#xff08;TPM&#xff09; 时引入的。。 就像TPM芯片神奇…

【机器学习算法】机器学习:支持向量机(SVM)

转载自&#xff1a; 【精选】机器学习&#xff1a;支持向量机&#xff08;SVM&#xff09;-CSDN博客 1.概述 1.1&#xff0c;概念 支持向量机&#xff08;SVM&#xff09;是一类按监督学习方式对数据进行二元分类的广义线性分类器&#xff0c;其决策边界是对学习样本求解的最…

这些来自各领域的全新机器人技术,你了解吗?

原创 | 文 BFT机器人 01 人机交互的新工具 在人机交互领域&#xff0c;来自欧洲各地的研究人员开发了一种名为HEUROBOX的新工具&#xff0c;用于评估交互。HEUROBOX提供了84个基本启发式和228个高级启发式&#xff0c;用于评估人机交互的各个方面&#xff0c;如安全性、人体工…

mac控制台命令小技巧

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 hello伙伴们&#xff0c;作为忠实的mac骨灰级别的粉丝&#xff0c;它真的给我带来了很多效率上的提升。那作为接…

金蝶云星空和旺店通·旗舰奇门接口打通对接实战

金蝶云星空和旺店通旗舰奇门接口打通对接实战 数据源系统:金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业…

三极管与mos管的区分与应用

三极管与mos管的区分与应用 这部分知识每次用都要查,隔一段时间就忘记了.忍无可忍,再此写下来,作为之后然后查找的笔记 这里先推荐几篇我查阅到的笔记, <<三极管和MOS管驱动电路的正确用法>> https://blog.csdn.net/qq_21794157/article/details/122736035 <<…

Azure 机器学习 - 搜索中的检索增强 (RAG)

目录 一、Azure AI 信息检索系统介绍二、采用 Azure AI 搜索的 RAG 方法三、适合 Azure AI 搜索的自定义 RAG 模式四、Azure AI 搜索中的可搜索内容五、Azure AI 搜索中的内容检索构建查询响应按相关性排名适用于 RAG 方案的 Azure AI 搜索查询的示例代码 六、集成代码和 LLM七…

无菌药品生产(A级区域)--气流流型测试可视化烟雾试验详细介绍

技术背景 无菌药品是指法定药品标准中列有无菌检测项目的制剂和原料药&#xff0c;包括注射剂、眼用制剂、无菌软膏剂、无菌混悬剂等。目前工程中&#xff0c;以注射剂产品为主的厂房占据了很大的比重。 无菌药品生产质量风险管理中&#xff0c;人员及其活动被视为重大的污染…

云计算行业敲门砖—证书盘点

未来10年&#xff0c;都会是云计算技术不断发展变革的时代&#xff0c;这其中会产生非常多的就业机会。有数据统计&#xff0c;未来五年&#xff0c;云计算行业人才缺口达150万&#xff0c;选对了行业&#xff0c;你就成功了一半。 云计算可以考的证书还是很多的&#xff0c;很…

【Unity小技巧】图片使用的一些常见问题

文章目录 前言Button不规则按钮点击空白区域不响应点击事件1. 设置资源参数2. 代码设置按钮Image的alphaHitTestMinimumThreshold3. 解释&#xff1a;4. 效果 Unity Image 原图比例控制方法一 Preserve Aspect1. 设置勾选Preserve Aspect&#xff08;保持长宽比&#xff09;&am…

Python的requests库:解决文档缺失问题的策略与实践

在Python的requests库中&#xff0c;有一个名为ALL_PROXY的参数&#xff0c;但是该参数的文档并未进行详细的描述。这使得用户在使用该参数时可能会遇到一些问题&#xff0c;例如不知道如何正确地配置和使用该参数。 解决方案 针对这个问题&#xff0c;我们可以采取以下几种解…

小小发票拦住出海“巨头”,合合信息智能文档处理技术助力企业重塑财务管理流程

作为连接企业采购、生产、运营、销售等经营行为的枢纽&#xff0c;财务系统的数字化、智能化升级近年来变得愈发重要。发票的录入、存储关乎企业应收账款管理和税务规范&#xff0c;通过技术手段提升发票管理的精准度与效率&#xff0c;也成为了财务数字化的关键环节。 近日&a…

CRM按行业细分的重要性

很多企业和销售会诟病CRM系统不够贴合行业、功能也不够细分和实用。因为各行各业的业务千差万别&#xff0c;所以功能完备、使用满意度高的CRM一定是与不同行业业务场景高度匹配的&#xff0c;是深度行业化的。因此行业化是CRM发展的重要趋势之一&#xff0c;为什么CRM一定要走…

竞赛选题 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

Apache Airflow (十一) :HiveOperator及调度HQL

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

【MySQL--->视图】

文章目录 [TOC](文章目录) 一、概念二、操作三、视图特性 一、概念 视图是一个由插叙结果组成的虚拟表,基于表查询结果得到的表叫做视图,被查询的表叫做基表.基表和视图进行更新操作会互相影响. 二、操作 创建视图 将dept和emp两个基表的查询结果作为视图 更新基表会影响视…

文具办公产品展示预约小程序的作用如何

从整体来看&#xff0c;文具办公品牌/门店的生意来源于线下自然流量或线上自营商城/入驻第三方商城的的流量&#xff0c;线上多数情况都是以直接销售配送为主&#xff0c;但其实对文具品牌/门店而言还有信息展示、服务预约、在线咨询、产品介绍等需求。 虽然小区周边的消费者需…

一些损失函数的学习

CrossEntropy loss 交叉熵是用来衡量两个概率分布之间的差异性或不相似性的度量交叉熵定义为两个概率分布p和q之间的度量。其中&#xff0c;p通常是真实分布&#xff0c;而q是模型预测的分布 交叉熵还等于信息熵 相对熵 这里&#xff0c;x遍历所有可能的事件&#xff0c;p(x)…

OpenAI与微软合作,构建 ChatGPT 5 模型;10天准确天气预报

&#x1f989; AI新闻 &#x1f680; OpenAI与微软合作&#xff0c;构建 ChatGPT 5 模型&#xff0c;下一代人工智能或拥有超级智能 摘要&#xff1a;OpenAI首席执行官 Sam Altman 在接受采访时表示&#xff0c;OpenAI正在与微软合作构建下一代人工智能模型 ChatGPT 5&#x…