当前位置: 首页 > 编程日记 > 正文

Entity Framework应用:根据实体的EntityState状态实现增删改查

在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查。

一、修改数据

上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询出来要修改的数据,然后在修改。但是这种操作会导致多次操作数据库:

从上面的截图中可以看出,查询数据的时候会执行一次事物,修改的时候又执行了一次事物,即修改数据会操作两次数据库。那么有没有什么方法可以只操作一次数据库呢?那就是下面要讲解的EntityState。

使用EntityState优化上面的修改方法:

 1 static void EditAdvance()
 2 {
 3      using (StudentSystemEntities dbContext = new StudentSystemEntities())
 4       {
 5            // 将EF执行的SQL语句输出到控制台
 6            dbContext.Database.Log += p => Console.WriteLine(p);
 7            // 创建要修改的对象
 8            Student stu = new Student()
 9            {
10                  StudentID = 14,
11                  Age = 690
12             };
13             // 通过上下文获取对象相关信息
14             DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
15             // 对象的状态是没有修改
16             entry.State = System.Data.Entity.EntityState.Unchanged;
17             // 对象的属性值Age修改了
18             entry.Property("Age").IsModified = true;
19             // 保存修改 会智能判断哪个对象的哪个属性值修改了
20             dbContext.SaveChanges();
21             Console.WriteLine("修改成功");
22      }                      
23 }

结果:

从上面的截图中不难看出,这次只操作了一次数据库。

好处:只执行一次数据库操作,不需要查询了,体现了EF修改的本质(通过实体对象的状态进行修改)。

二、删除

 1 static void DeleteAdvance()
 2 {
 3      using (StudentSystemEntities dbContext = new StudentSystemEntities())
 4      {
 5          // 将EF执行的SQL语句输出到控制台
 6          dbContext.Database.Log += p => Console.WriteLine(p);
 7          // 先查询然后在删除
 8          Student stu = new Student()
 9          {
10                StudentID = 14
11           };
12           DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
13           entry.State = System.Data.Entity.EntityState.Deleted;
14           // 保存,智能判断对象的状态
15           dbContext.SaveChanges();
16           Console.WriteLine("删除成功");
17       }
18 }

结果:

三、新增数据

 1 static void AddAdvance()
 2 {
 3      using (StudentSystemEntities dbContext = new StudentSystemEntities())
 4       {
 5           // 定义Student对象
 6           Student stu = new Student()
 7           {
 8                StudentName = "花千骨",
 9                Sex = "",
10                Age = 3422,
11                Major = "舞蹈专业",
12                Email = "2345678911@qq.com"
13            };
14            // 将EF执行的SQL语句输出到控制台
15            dbContext.Database.Log += p => Console.WriteLine(p);
16            DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
17            entry.State = System.Data.Entity.EntityState.Added;
18             // 保存的数据库
19             dbContext.SaveChanges();
20             Console.WriteLine("保存成功");
21       }
22 }

四、批处理

利用EntityState可以很好的实现批处理功能,例如下面的例子:增加两条数据,修改一条数据,删除一条数据

 1 static void Save()
 2 {
 3       using (StudentSystemEntities dbContext = new StudentSystemEntities())
 4       {
 5            // 将EF执行的SQL语句输出到控制台
 6            dbContext.Database.Log += p => Console.WriteLine(p);
 7            // 新增数据1
 8            Student stu1 = new Student()
 9            {
10                StudentName = "红孩儿",
11                Age = 456,
12                Major = "冶金专业"
13             };
14             dbContext.Students.Add(stu1);
15 
16             // 新增数据2
17             Student stu2 = new Student()
18             {
19                 StudentName = "青牛精",
20                 Age = 345,
21                 Major = "炼丹"
22              };
23              // 使用状态
24              DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu2);
25               entry.State = System.Data.Entity.EntityState.Added;
26 
27               // 修改数据
28               Student stuEdit = new Student()
29               {
30                     StudentID=5,
31                     Age=678
32               };
33               //状态
34               DbEntityEntry<Student> entryEdit = dbContext.Entry<Student>(stuEdit);
35               entryEdit.State = System.Data.Entity.EntityState.Unchanged;
36               entryEdit.Property("Age").IsModified = true;
37 
38               // 删除数据
39               Student stuDel = new Student()
40               {
41                    StudentID=22
42               };
43               DbEntityEntry<Student> entryDel = dbContext.Entry<Student>(stuDel);
44               entryDel.State = System.Data.Entity.EntityState.Deleted;
45 
46               // 保存
47               dbContext.SaveChanges();
48               Console.WriteLine("保存成功");
49       }               
50 }

使用EntityState实现批处理功能,只需要执行一次SaveChange()就可以了,如果是使用原来的方式就需要多次执行SaveChange(),这样可以减少数据库的操作。

总结:无论是add、remove、savechanges都是根据EF包装实体的State进行相应的增删改操作。

转载于:https://www.cnblogs.com/dotnet261010/p/9085678.html

相关文章:

几种Normalization算法.md

神经网络有各种归一化算法&#xff0c;BN&#xff0c;LN&#xff0c;IN,GN。 1. Batch Normalization 实现流程&#xff1a;对Tensor为[N, C, H, W], 把第1个样本的第1个通道&#xff0c;加上第2个样本的第1个通道&#xff0c; 加上第N个样本的第1个通道&#xff0c;求平均&…

【java】浅谈注释

java中的注释可以分为三大类&#xff1a;行注释、块注释以及文档注释 行注释&#xff1a; 基本语法&#xff1a; //注释的内容 产生 效果&#xff1a;该行//之后的内容就都被注释了 块注释&#xff1a; 基本语法&#xff1a; /* 注释内容 */ 注&#xff1a;块注释禁止嵌套…

一个“复制/删除”方式的滚动

一个利用复制和删除节点的方式做的滚动。。。不知性能怎样呢&#xff1f; 一个滚动Left Right 12345678转载于:https://www.cnblogs.com/lbsgood/archive/2012/06/08/2541177.html

OSPF-网络类型(ip ospf network ?)

在介绍之前首先看个表&#xff01;二层链路与OSPF网络类型有什么联系呢&#xff1f;其实中间的关系可大了&#xff0c;OSPF网络类型应该说是根据二层链路的类型来选择的&#xff0c;而且两者应用匹配&#xff0c;也就是当OSPF网络类型支持组播时&#xff0c;如果二层链路不支持…

E20180525-hm

sensitive adj. 敏感的; 感觉的; [仪] 灵敏的; 易受影响的; lookup v. 查找; 查表; speedy adj. 快的&#xff0c;迅速的; 敏捷的 marshal vt. 整理&#xff0c;排列&#xff0c;集结; vi. 排列; 编队; n. 元帅; 典礼官; 执法官; 消防局长; feature n. 特征&#xff0c;特点;…

[题解]RGB Substring (hard version)-前缀和(codeforces 1196D2)

题目链接&#xff1a;https://codeforces.com/problemset/problem/1196/D2 题意&#xff1a; q 个询问&#xff0c;每个查询将给你一个由 n 个字符组成的字符串s&#xff0c;每个字符都是 “R”、“G” 或 “B”。 求出更改初始字符串 s 中的最小字符数&#xff0c;以便更改后将…

C#连接MySql

1.从http://prdownloads.sourceforge.net/mysqldrivercs/MySQLDriverCS-n-EasyQueryTools-3.0.18.exe?download上下载MySQLDriverCS. 然后安装。2.从安装目录中把MySQLDriverCS.dll.添加到.net的组件 1 public void Connect_Net()2 {3 MySQLConnection m…

【java】快速复制数组方法arraycopy的使用

通常进行数组的复制需要使用到循环&#xff0c;然而jdk中已经给我们封装好了一个专门用来复制数组的快捷方法 arraycopy&#xff08;&#xff09; 使用方法&#xff1a; System.arraycopy(src, srcPos, dest, destPos, length); 注&#xff1a; src:被复制的数组 srcPos&am…

【指针的高级声明】

在分享这些高级声明之前&#xff0c;我想&#xff0c;大家有必要知道各个操作符在C、C语言中的优先级&#xff0c;以便识别欲讲述的高级声明。这里先列举一些高级声明的例子&#xff0c;能自己揣摩清楚最好不过了&#xff0c;如果有想不懂的地方&#xff0c;请参见下方的识别方…

【大数据实时计算框架】Storm框架

一、大数据实时计算框架 1、什么是实时计算&#xff1f;流式计算&#xff1f; &#xff08;一&#xff09;什么是Storm?Storm为分布式实时计算提供了一组通用原语&#xff0c;可被用于“流处理”之中&#xff0c;实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方…

引用-ZIGBEE-ZSTACK网络配置相关问题

下面是以道友问的问题&#xff0c;这里简单做分析&#xff0c;仅供交流学习用&#xff0c;有什么不对之处还请各位大虾指正。鄙人邮箱为&#xff1a;peterpanjy163.com. 欢迎交流&#xff01;&#xff01;1&#xff1a; 最主要的就是路由问题。我用06协议栈自带的例子程序sampl…

GHOST还原教程详细

要提醒您注意的是在使用 GHSOT 软件恢复系统时&#xff0c;请勿中途中止&#xff01;如果您在恢复过程中重新启动了计算机那么您的计算机将无法启动&#xff01;必定要接双硬盘或用光盘系统启动才可恢复 在您的系统遇到以下的情况之一 怀疑或确定您的系统中了病毒或木马 系统运…

【java】增强for循环的简单使用(遍历数组)

public class Test4 {public static void main(String[] args) {int[] intArray {1, 2, 4, 5, 7, 8};for(int number : intArray) {System.out.println(number);}} }

字符设备驱动程序 2

三、字符设备的注册内核内部使用struct cdev结构来表示字符设备。在内核调用设备的操作之前&#xff0c;必须分配并注册一个或多个struct cdev。代码应包含<linux/cdev.h>&#xff0c;它定义了struct cdev以及与其相关的一些辅助函数。 注册一个独立的cdev设备的基本过程…

qmake 简易教程

qmake 简易教程 qmake是Qt开发中默认的构建工具。posted on 2018-05-27 00:09 JichengTang 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/tangjicheng/p/9094857.html

MSF连环攻击实验

MSF连续攻击实验 一、实验拓扑 二、实验环境 Windows XP BT 5 32位 三、实验原理 通过扫描 XP主机&#xff0c;利用扫描出的漏洞建立 TCP会话&#xff0c;通过进程的提权&#xff0c;进一步获取目标机的控制权限 四、实验目的 掌握MSF连续攻击的原理和利用MSF攻击检测技术进行服…

【java】关于面向对象优点的个人理解

本文只是一些个人的理解&#xff0c;没有过多的进行基础理论的堆积&#xff0c;尽量说人话&#xff0c;让不懂的人也可以有一点概念。 相同的目标&#xff1a; 去第一餐厅吃饭 面向过程&#xff1a; 进入第一餐厅、买饭、吃饭 面向对象&#xff1a; 创建对象 第一餐厅、同…

(转)flash的Socket通讯沙箱和安全策略问题

一、沙箱和安全策略问题 1、此问题发生在连接时&#xff0c;准确地说是连接前&#xff0c;分别两种情况&#xff1a; 1.本地播放 本地播放时&#xff0c;默认情况下Flash Player将不允许swf访问任何网络。 访问http://www.macromedia.com/suppor…

asp.net code-behind

asp.net code-behind 技术是指页面与代码分离。 asp.net framework允许创建两种不同的页面&#xff0c;一种是单页面&#xff08;页面包含页面代码与控件&#xff0c;页面代码包含在<script runat"server"></script>标签中&#xff09;&#xff0c;另外一…

python 基础_列表的其他操作 4

一.查找某个元素在数组中出现的次数 &#xff0c;count的运用 a [a,b,c,c,c,a] print(a.count(c)) 二.把一个元素插入到另一个元素的末尾&#xff0c;extend。如下面&#xff0c;把b里面的值赋予给a。 a [a,b,c] b [d,e,f] a.extend(b) print (a) print (b) 输出的结果为 [a…

DataGrid和GridView单击背景变色双击颜色还原

DataGrid中 首先我们假设.aspx文件中DataGrid的数据行的样式为 <AlternatingItemStyle BackColor"White" ForeColor"#284775" /><ItemStyle BackColor"#F7F6F3" ForeColor"#333333" /> 则在DataGrid的ItemDataBound事件中…

elasticsearch的备份和恢复(转)

vim /etc/elasticsearch/elasticsearch.yml path.repo: ["/data/backups/es_backup"] #备份目录&#xff0c;根据自己情况进行填写 systemctl restart elasticsearch.service mkdir -pv /data/backups/es_backup chmod 755 /data/backups/es_backup chown elas…

【javamatlab】以一个简单的例子实现java和matlab混编

目录 使用环境&#xff1a; MATLAB: matlab代码&#xff1a; 将matlab代码打包&#xff1a; eclipse&#xff1a; jar包配置&#xff1a; 使用jar包&#xff1a; 使用环境&#xff1a; jdk8&#xff08;ide使用eclipse2019-6&#xff09;、matlab2019a 应该从2018开始m…

转载CSDN - 从程序员到HR——面试经验分享

CSDN博客一周热文推荐&#xff0c;为您总结回顾过去一周的CSDN博客热门文章&#xff0c;推荐优质的博客作者&#xff0c;分享精华文章和优质博客。 [1] 谭海燕&#xff1a;北漂之惠普H3C面试经历 上一篇讲到了《北漂之百度面试》&#xff0c;今天跟大家分享我在H3C的面试经历。…

近期上海面试总结(一)

转眼来上海已经4年了&#xff0c;随着对公司业务的不断熟悉&#xff0c;同时通过与众多的人接触也渐渐加深了对职场的理解&#xff0c;从刚开始的初生牛犊不怕虎毅然来到上海&#xff0c;到如今已快有四个年头了&#xff0c;今年还是面临职场上的抉择&#xff0c;再次找工作吧&…

Expect 教程中文版

原文链接 本教程由*葫芦娃*翻译&#xff0c;并做了适当的修改&#xff0c;可以自由的用于非商业目的。 [BUG]   有不少部分&#xff0c;翻译的时候不能作到“信&#xff0c;达”。当然了&#xff0c;任何时候都没有做到“雅”&#xff0c;希望各位谅解。 [原著]     Don L…

【智能小车】舵机的基本原理(学习自平衡小车之家的资料)

概述&#xff1a; 根据控制方式舵机应该称为微型伺服马达。早期在模型上使用最多&#xff0c;主要用于控制模型的舵面&#xff0c;所以俗称舵机。舵机特点是接受一个简单的控制指令就可以自动转到一个比较精确的角度。 注&#xff1a; 微型伺服马达&#xff1a;一个微型伺服马…

005本周总结报告

这周主要学习了java中的类和对象的知识点&#xff0c;发现和C中的类和对象极为相似&#xff0c;对于类和对象的概念理解起来也简单。同时在自学的过程中也把类的知识重新复习巩固了一下&#xff08;如类的三大特征&#xff1a;继承&#xff0c;封装和多态&#xff0c;构造&…

IE6 下div高度显示的问题

IE6下默认的字体尺寸大致在 12 - 14px 之间&#xff0c;当你试图定义一个高度小于这个默认值的 div 的时候&#xff0c; IE 会固执的认为这个层的高度不应该小于字体的行高。所以即使你用 height: 6px; 来定义了一个 div 的高度&#xff0c;实际在 IE 下显示的仍然是一个 12 px…

ASP.NET Core 2 学习笔记(七)路由

ASP.NET Core通过路由(Routing)设定&#xff0c;将定义的URL规则找到相对应行为&#xff1b;当使用者Request的URL满足特定规则条件时&#xff0c;则自动对应到相符合的行为处理。从ASP.NET就已经存在的架构&#xff0c;而且用法也很相似&#xff0c;只有些许的不同。本篇将介绍…