日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Entity?Framework根據實體的EntityState狀態實現增刪改查_實用技巧

作者:.NET開發菜鳥 ? 更新時間: 2022-05-08 編程語言

在上一篇文章中,我們講解了使用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 entry = dbContext.Entry(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 entry = dbContext.Entry(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 entry = dbContext.Entry(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 entry = dbContext.Entry(stu2);
              entry.State = System.Data.Entity.EntityState.Added;

              // 修改數據
              Student stuEdit = new Student()
              {
                    StudentID=5,
                    Age=678
              };
              //狀態
              DbEntityEntry entryEdit = dbContext.Entry(stuEdit);
              entryEdit.State = System.Data.Entity.EntityState.Unchanged;
              entryEdit.Property("Age").IsModified = true;

              // 刪除數據
              Student stuDel = new Student()
              {
                   StudentID=22
              };
              DbEntityEntry entryDel = dbContext.Entry(stuDel);
              entryDel.State = System.Data.Entity.EntityState.Deleted;

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

使用EntityState實現批處理功能,只需要執行一次SaveChange()就可以了,如果是使用原來的方式就需要多次執行SaveChange(),這樣可以減少數據庫的操作。

總結:無論是add、remove、savechanges都是根據EF包裝實體的State進行相應的增刪改操作。

原文鏈接:https://www.cnblogs.com/dotnet261010/p/9085678.html

欄目分類
最近更新