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 ()各种经验因为不被.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

五、后记

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

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

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

相关文章

外卖小程序系统:数字化时代餐饮业的技术奇迹

在当今数字化时代&#xff0c;外卖小程序系统正以其强大的技术背后支持&#xff0c;成为餐饮业务的一项奇迹。这个系统不仅提供了便捷的点餐体验&#xff0c;更通过先进的技术手段&#xff0c;实现了高效订单处理、智能推荐以及实时配送追踪。下面&#xff0c;我们将深入探讨外…

HarmonyOS ArkTS语言,运行Hello World(二)

一、认识DevEco Studio界面 进入IDE后&#xff0c;我们首先了解一下基础的界面。整个IDE的界面大致上可以分为四个部分&#xff0c;分别是代码编辑区、通知栏、工程目录区以及预览区。 代码编辑区 1、中间的是代码编辑区&#xff0c;你可以在这里修改你的代码&#xff0c;以…

22年+21年 计算机能力挑战赛初赛C语言程序题 题解

22年 第14题&#xff1a;答案&#xff1a;33 #include<stdio.h> int x1; int f(int a) { static int x2;int n0;if(a%2){ static int x3;nx; }else { static int x5;nx; }return nx;} void main() { int sumx,i;for(i0;i<4;i) sumf(i); printf(&qu…

数值的整数次方Pow(x,n)

求数组的整数次方 思想&#xff1a; 分而治之 首先判断正负数&#xff0c;然后判断奇偶性问题&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&a…

vue3父组件提交校验多个子组件

实现功能&#xff1a;在父组件提交事件中校验多个子组件中的form 父组件&#xff1a; <script setup lang"ts">import {ref, reactive} from vueimport childForm from ./childForm.vueimport childForm2 from ./childForm2.vuelet approvalRef ref()let ap…

华东理工李洪林课题组开发 Macformer,加速大环类药物发现

大环类化合物是指由 12 个以上原子组成的小分子或肽。相较于其他小分子化合物&#xff0c;大环类化合物在结构和性能上有着诸多优势&#xff0c;也因此被视为各类靶点的潜在治疗药物。 基于药物化学合成的大环类似物是大环类药物的一个主要来源。然而&#xff0c;由于合成方法…

数字引领,智慧赋能|袋鼠云与易知微共同亮相2023智慧港口大会

2023年10月19日&#xff0c;由中国港口协会、中国交通通信信息中心、天津港&#xff08;集团&#xff09;有限公司主办&#xff0c;中国港口协会智慧港口专业委员会、《港口科技》杂志社等单位承办的以“数字引领 智慧赋能”为主题的“2023智慧港口大会”在天津顺利召开。 袋鼠…

Linux:安装IDEA开发工具

1、下载 下载地址&#xff1a;https://www.jetbrains.com/idea/download/?sectionlinux 2、上传及解压 将安装包上传到虚拟机&#xff0c;我建的目录是/opt/idea 解压&#xff1a;tar -zxvf ideaIU-2023.2.5.tar.gz 3、启动 启动IDEA需要登陆桌面系统&#xff0c;不能在…

【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)

文章目录 先来看看最终效果前言素材简单绘制库存UI前往mixamo获取人物模型动画获取一些自己喜欢的装备物品模型库存系统换装系统装备偏移问题添加消耗品最终效果源码完结 先来看看最终效果 前言 之前2d的换装和库存系统我们都做过不少了&#xff0c;这次就来学习一个3d版本的&…

vue3之echarts区域折线图

vue3之echarts区域折线图 效果&#xff1a; 核心代码&#xff1a; <template><div class"abnormal"><div class"per">单位&#xff1a;{{ obj.data?.unit }}</div><div class"chart" ref"chartsRef"&g…

【5k字长文 | Vue学习笔记】#1 认识Vue对象和基础语法

Vue是一个非常流行的渐进式JavaScript框架&#xff0c;渐进式指的是自底向上&#xff0c;从小组件逐渐向上构成整个项目&#xff0c;渐进式还可以理解为&#xff1a;用什么就拿什么&#xff0c;每个组件只做自己的事&#xff0c;尽可能解耦合。 本节我们将学习简单的Vue实例&a…

Sublime Text:代码编辑器的卓越典范

Sublime Text是一款高效、强大且灵活的代码编辑器&#xff0c;在开发社区中广受欢迎。它不仅提供了丰富的功能&#xff0c;还具备美观的界面和卓越的性能&#xff0c;成为了众多开发者的首选工具。 Sublime Text的优点 高性能&#xff1a;Sublime Text具有极高的启动速度和响…