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

 更新时间:2022年03月09日 08:55:49   作者:.NET开发菜鸟  
这篇文章介绍了Entity Framework根据实体的EntityState状态实现增删改查,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

上一篇文章中,我们讲解了使用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状态实现增删改查,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 基于 .NET 6 的ASP.NET Core启动地址配置方法及优先级顺序

    基于 .NET 6 的ASP.NET Core启动地址配置方法及优先级顺序

    这篇文章主要介绍了ASP.NET Core启动地址配置方法及优先级顺序, .NET 6 使用了最小 WEB API, 配置方式已经部分发生了变化,下面文章我们来看看具体的方法,需要的小伙伴可以参考一下
    2022-03-03
  • .Net弹性和瞬态故障处理库Polly实现执行策略

    .Net弹性和瞬态故障处理库Polly实现执行策略

    这篇文章介绍了.Net弹性和瞬态故障处理库Polly实现执行策略的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • .NetCore之接口缓存的实现示例

    .NetCore之接口缓存的实现示例

    这篇文章主要介绍了.NetCore之接口缓存的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • asp.net AJAX注册类

    asp.net AJAX注册类

    单纯用JavaScript,不需要注册,但是就是用不了AJAX的某些机制。
    2010-02-02
  • Asp.net Core 如何设置黑白名单(路由限制)

    Asp.net Core 如何设置黑白名单(路由限制)

    本文主要介绍了Asp.net Core 如何设置黑白名单(路由限制),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • NetCore 3.0文件上传和大文件上传的限制详解

    NetCore 3.0文件上传和大文件上传的限制详解

    这篇文章主要给大家介绍了关于NetCore 3.0文件上传和大文件上传限制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用NetCore 3.0具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 在 .NET 中使用 FixedTimeEquals 应对计时攻击的例子

    在 .NET 中使用 FixedTimeEquals 应对计时攻击的例子

    在计算机安全中,计时攻击(Timing attack)是旁道攻击 (Side-channel attack) 的一种,而旁道攻击是根据计算机处理过程发出的信息进行分析,这篇文章主要介绍了在 .NET 中使用 FixedTimeEquals 应对计时攻击,需要的朋友可以参考下
    2022-06-06
  • DotNetCore深入了解之HttpClientFactory类详解

    DotNetCore深入了解之HttpClientFactory类详解

    这篇文章主要给大家介绍了关于DotNetCore深入了解之HttpClientFactory类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • asp.net用url重写URLReWriter实现任意二级域名 新

    asp.net用url重写URLReWriter实现任意二级域名 新

    最近有个朋友要做url重写的东西,我帮他弄了弄,回头看当年自己写的那个文章,当时以为自己写的很容易理解.但现在再看却觉得写的不好.而今天百度了一下urlrewriter发现我这个文章竟然排第二.为了方便更多朋友,我再写点东西补充下.
    2009-11-11
  • 为TextBox装饰水印与(blur和focus)事件应用

    为TextBox装饰水印与(blur和focus)事件应用

    为了界面的美观,有些时候可能需要为文本框(TextBox)装饰个水印;它有两种状态,一是blur和focus。因此,我们可以在Javascript写两个事件,感兴趣的朋友可以了解下
    2013-01-01

最新评论