在上一篇文章中,我们讲解了使用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

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

  1. html单页面js完成表数据库自动生成带注释的java实体类和简单的增删改查sql

    支持Mysql和Oracle,mybatis和ibatis可选.功能主要还是字符串的拼凑完成的,把用把表信息复制过来或者增加后台,就可以生成简单的增删改查了 临时体验点这里 我也不知道地址什么时候失效 ...

  2. java里SQL insert操作的语法_Java含个人总结语法:JDBC,学生表,实体类,集合,增删改查,注入,预处理【诗书画唱】...

    create table denglu( uname varchar(30), upwd varchar(30) ) insert into denglu values('诗书','123') ins ...

  3. mybatis mapper.xml数据库映射生成java实体,增删改查sql语句

    1.问题描述:使用mybatis生成mapper.xml文件的时候经常遇到数据库表字段很多,写mapper.xml文件时转化成java实体很麻烦,写增删改查的sql时也要做 很多重复的工作.程序员就想 ...

  4. 【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

    [EF学习笔记09]----------使用 EntityState 枚举标记实体状态,实现增删改查 讲解之前,先来看一下我们的数据库结构:班级表 学生表 如上图,实体状态由EntityState枚举 ...

  5. 使用EF框架实现MVC的增删改查功能!!!Entity Framework

    一.什么是EF? ADO.NETEntity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.ADO.NET Entity Fram ...

  6. Entity Framework使用DBContext实现增删改查示例

    这篇文章介绍了Entity Framework使用DBContext实现增删改查的方法,文中通过示例代码介绍的非常详细.对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 有一段时间没有更 ...

  7. MVC新手教程三:Entity Framework 4.0 来实现MVC的增删改查功能,10分钟搞定

    在这一节,我们使用VS2010自带的EF4.0来实现MVC的增删查改功能,为什么用EF呢?因为如果你自己手写sqlhelper之类,或者是用动软,和我们用EF的速度比,太慢太慢··· 当然,新手还是用 ...

  8. OA中项目关系,实体设计,映射实体,增删改查

    =============== 步骤 ================ 1,充分了解需求(包括所有的细节):分析页面等. 2,设计实体/表  正向工程:设计实体 --> 建表(推荐):设计实体 ...

  9. c#利用反射+特性实现简单的实体映射数据库操作类实现自动增删改查(一)

    ///对字段特性的映射类 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

最新文章

  1. Storyboard初体验
  2. micropython实现多任务_python多任务处理
  3. sql语言和php,SQL语言快速入门(三)_php
  4. 提供呼叫中心服务器,呼叫中心系统方案
  5. jmeter五种参数化方式之CSV Data Set Config参数化
  6. 时间复杂度O(n^2)和O(nlog n)差距有多大?
  7. AWS亚马逊ssh登录失败 Permissions 0644 for .pem are too open
  8. dnf服务器的ini配置文件,dnf分辨率配置文件在哪 | 手游网游页游攻略大全
  9. 嵌入式高速串行并行技术_推荐(张锋)
  10. 无人机集群通信网络拓扑重构及关键技术研究∗
  11. Error: L6218E: Undefined symbol LED_Init (referred from main.o).
  12. 对应分析图解读的七种方法
  13. 新的研究评估Masimo ORi™反映中度高氧期间氧合状况的功能
  14. Visionpro棋盘格校正
  15. 链表OJ题---Java实现
  16. 【Caffe学习三】基于ROC-RK3399-PC/Ubuntu18.04的Caffe-SSD-CPU 安装编译___BUG
  17. 或许 心血来潮才有这样的好心情
  18. 泛微软件服务器是多少,泛微oa云服务器要求
  19. 小程序源码提取工具_小程序一款高效的视频声音提取和识别工具!
  20. 1、手机调试app出现签名不一致,该应用可能已被修改

热门文章

  1. linux串口驱动分析
  2. uva 315 (poj 1144 求割点)
  3. C#中DateTime.Now.Ticks的用法和说明
  4. 目录树结构改变后刷新目录树
  5. 10个最常用 Windows Vista运行命令
  6. 爱情也许是最忧伤的童话
  7. 数学建模优化模型简单例题_数学建模之优化模型:存储模型
  8. 用户体验改善案例_如何检测用户的设备,以便改善他们的用户体验
  9. 使用Flow检查React,Redux和React-Redux的全面指南
  10. JavaScript的“ this”通过成立一个高中乐队来解释