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

2022-04-17 11:26:05

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

一、修改数据

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

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

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

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

static void EditAdvance(){     using (StudentSystemEntities dbContext = new StudentSystemEntities())      {           // 将EF执行的SQL语句输出到控制台      www.easck.com     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("修改成功");     }}

结果:

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

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

好处:只执行一次数据库操作,不需要查询了,体现了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("删除成功");      }}

结果:

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

三、新增数据

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("保存成功");      }}

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

四、批处理

利用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         www.easck.com     };              DbEntityEntry<Student> entryDel = dbContext.Entry<Student>(stuDel);              entryDel.State = System.Data.Entity.EntityState.Deleted;              // 保存        www.easck.com      dbContext.SaveChanges();              Console.WriteLine("保存成功");      }}

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

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

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