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 = "[email protected]"
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

时间: 2024-11-02 16:10:10

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

Entity Framework 教程——Entity Framework中的实体类型

Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. POCO Entity (Plain Old CLR Object): POCO类是不依赖任何框架的类型,如同其他正常的一般类型,我们称之为"Plain Old CLR Objects"(这里不知道怎么翻译,普通的CLR对象?古老的CLR对象?大概意思就是没有什么特殊的对象吧). POC

entity framework—简单的增删改查

应用程序对数据库执行CRUD时,通过entity framework方式,实际上是对DbContext的操作,DbContext是EF的入口,DbContext拿到对应的消息(CRUD)后,通过ORM中的Mapping来将对象O映射成数据库中的关系R. 下面就简单的实现一下利用entity framework实现简单的增删改查.首先要说明的是我已经建立了在解决方案中映射了数据库中表"Customer".所有的操作都是针对这张表. 1.增加 Customer customer = new

entity framework 新手入门篇(2)-entity framework基本的增删改查

经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 一.entity framework 相关类的理解. 首先,House数据库在映射后会生成一个名为HouseEntities的类,这个类我们称之为数据上下文,可以简单的理解为数据库的部分映射(如果映射了全部的表,视图,存储过程,则可看作全部映射). 使用数据库的时

【C#】Entity Framework 增删改查和事务操作

1.增加对象 DbEntity db = new DbEntity(); //创建对象实体,注意,这里需要对所有属性进行赋值(除了自动增长主键外),如果不赋值,则会数据库中会被设置为NULL(注意是否可空) var user = new User { Name = "bomo", Age = 21, Gender = "male" }; db.User.Add(user); db.SaveChanges(); 2.删除对象,删除只需要对象的主键 DbEntity d

ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查

原文:ASP.NET CORE系列[二]使用Entity Framework Core进行增删改查 介绍 EntityFrameworkCore EF core 是一个轻量级的,可扩展的EF的跨平台版本.对于EF而言 EF core 包含许多提升和新特性,同时 EF core 是一个全新的代码库,并不如 EF6 那么成熟和稳定.EF core 保持了和EF相似的开发体验,大多数顶级API都被保留了下来,所以,如果你用过EF6,那么上手EF core你会觉得非常轻松和熟悉,EF core 构建在一

ASP.NET Web API基于OData的增删改查,以及处理实体间关系

本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Category { get; set; } [ForeignKey("Sup

Entity - 使用EF框架进行增删改查 - 模型先行

模型先行:先创建数据库实体模型,然后再进行数据库的增删改查. 基本步骤是不变的,可参照 <Entity - 使用EF框架进行增删改查 - 数据库先行> 其中的不同是,在创建数据库实体模型的时候,不是选择已有数据库,而是选择空白.

Entity Framework Code First实体关联数据加载

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity Framework常用处理数据关联加载的方

Entity Framework 4.1 Change Tracker EF状态跟踪函数解析

Skip to main content Data Developer Center Sign in United States (English) HomeLibraryLearnDownloadsSupportCommunityForums Change Tracker API Entity Framework 4.1 Change Tracker Julie Lerman http://thedatafarm.com Published: June 2011 Download the co