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进行相应的增删改操作。

posted @ 2019-07-08 17:53  大锅锅  阅读(319)  评论(0编辑  收藏  举报