zoukankan      html  css  js  c++  java
  • 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进行相应的增删改操作。

  • 相关阅读:
    幂不等式
    一个对数级数的求和
    数列极限
    求幂级数的和函数
    证明整数为平方数
    java获取当前时间戳的方法
    《编程小白的第一本python入门书》笔记 二
    《编程小白的第一本python入门书》笔记 一
    python班级群中的问题记录-2016.12.30
    python班级群中的问题记录-2016.12.22
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/9085678.html
Copyright © 2011-2022 走看看