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

EF批量操作与EntityState
本文详细介绍了如何使用Entity Framework的EntityState特性进行数据的高效批量处理,包括新增、修改和删除操作,通过实例展示了如何仅执行一次SaveChanges即可完成所有操作,显著减少数据库交互。

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

一、修改数据

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

查询数据的时候会执行一次事物,修改的时候又执行了一次事物,即修改数据会操作两次数据库。那么有没有什么方法可以只操作一次数据库呢?那就是下面要讲解的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("修改成功");
     }                      
}

二、删除

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值