EF根据EntityState状态实现增删改查

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

EF根据EntityState状态实现增删改查

.NET开发菜鸟   2022-05-28 我要评论

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

一、修改数据

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

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

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

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

结果:

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

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

二、删除

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

结果:

三、新增数据

static void AddAdvance()
{
     using (StudentSystemEntities dbContext = new StudentSystemEntities())
      {
          // 定义Student对象
          Student stu = new Student()
          {
               StudentName = "花千骨",
               Sex = "女",
               Age = 3422,
               Major = "舞蹈专业",
               Email = "2345678911@qq.com"
           };
           // 将EF执行的SQL语句输出到控制台
           dbContext.Database.Log += p => Console.WriteLine(p);
           DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
           entry.State = System.Data.Entity.EntityState.Added;
            // 保存的数据库
            dbContext.SaveChanges();
            Console.WriteLine("保存成功");
      }
}

四、批处理

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

static void Save()
{
      using (StudentSystemEntities dbContext = new StudentSystemEntities())
      {
           // 将EF执行的SQL语句输出到控制台
           dbContext.Database.Log += p => Console.WriteLine(p);
           // 新增数据1
           Student stu1 = new Student()
           {
               StudentName = "红孩儿",
               Age = 456,
               Major = "冶金专业"
            };
            dbContext.Students.Add(stu1);

            // 新增数据2
            Student stu2 = new Student()
            {
                StudentName = "青牛精",
                Age = 345,
                Major = "炼丹"
             };
             // 使用状态
             DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu2);
              entry.State = System.Data.Entity.EntityState.Added;

              // 修改数据
              Student stuEdit = new Student()
              {
                    StudentID=5,
                    Age=678
              };
              //状态
              DbEntityEntry<Student> entryEdit = dbContext.Entry<Student>(stuEdit);
              entryEdit.State = System.Data.Entity.EntityState.Unchanged;
              entryEdit.Property("Age").IsModified = true;

              // 删除数据
              Student stuDel = new Student()
              {
                   StudentID=22
              };
              DbEntityEntry<Student> entryDel = dbContext.Entry<Student>(stuDel);
              entryDel.State = System.Data.Entity.EntityState.Deleted;

              // 保存
              dbContext.SaveChanges();
              Console.WriteLine("保存成功");
      }
}

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

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

以上所述是小编给大家介绍的Entity Framework根据实体的EntityState状态实现增删改查,希望对大家有所帮助。在此也非常感谢大家对网站的支持!

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们