2020年10月22日 星期四

Entity Framework Core EF Core 的 紀錄刪除

Entity Framework Core EF Core 的 紀錄刪除

在上一篇 EF Core 討論文章 EF Core 的 紀錄修改 ,說明了如何使用 EF Core 來修改資料庫紀錄的做法。

在這篇文章中,來了解如何使用 EF Core 來進行記錄刪除動作的作法,關於更多這方面的應用,可以參考 基本儲存 這份文件內容。

請按照底下的步驟來進行操作

建立練習專案

  • 打開 Visual Studio 2019

  • 點選 [建立新的專案] 按鈕

  • 在 [建立新專案] 對話窗內,選擇 [Blazor 應用程式] 專案樣板

  • 在 [設定新的專案] 對話窗內,於 [專案名稱] 欄位內輸入 efDeleteRecord

  • 在 [建立新的 Blazor 應用程式] 對話窗內,選擇 [Blazor 伺服器應用程式] 這個選項

    在該對話窗右半部的其他選項,可以不用變更

  • 點選 [建立] 按鈕,以便開始建立這個專案

加入 Entity Framework Core 要使用到的 NuGet 套件

  • 滑鼠右擊專案內的 [相依性] 節點
  • 選擇 [管理 NuGet 套件]
  • 點選 [瀏覽] 標籤分頁頁次
  • 在 [搜尋] 文字輸入盒內,輸入 [Microsoft.EntityFrameworkCore.SqlServer]
  • 點選 [安裝] 按鈕以便安裝這個套件
  • 在 [搜尋] 文字輸入盒內,輸入 [Microsoft.EntityFrameworkCore.Tools]
  • 點選 [安裝] 按鈕以便安裝這個套件

使用反向工程來產生 Entity Framework 要用到的 Entity 模型相關類別

  • 切換到 [套件管理器主控台] 視窗

    若沒有看到 [套件管理器主控台] 視窗,點選功能表 [工具] > [NuGet 套件管理員] > [套件管理器主控台]

  • 在 [套件管理器主控台] 輸入底下內容

    因為都在同一個專案內,所以,這裡可以省略 StartupProject & Project 這兩個參數,因此,底下的指令會更為精簡

Scaffold-DbContext "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=School" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f

請打開這個 [Program.cs] 檔案,完成底下的程式碼

static void Main(string[] args)
{
    var context = new DataContext();
    context.Database.EnsureDeleted();
    context.Database.EnsureCreated();
 
    context.Department.Add(new Department());
    context.Entry(new Department()).State = EntityState.Added;
    context.SaveChanges();
    Console.WriteLine($"科系記錄數量:{context.Department.ToList().Count}");
    var departments = context.Department.ToList();
    Reset(context); // 清除 ChangeTracker 內的科系紀錄
    context.Department.Remove(departments[0]);
    context.Entry(departments[1]).State = EntityState.Deleted;
    context.SaveChanges();
    Console.WriteLine($"科系記錄數量:{context.Department.ToList().Count}");
}
public static void Reset(DataContext context)
{
    #region 解除快取紀錄
    foreach (var item in context
        .Set<Department>().Local.ToList())
    {
        context.Entry(item).State = 
            Microsoft.EntityFrameworkCore.EntityState.Detached;
    }
    #endregion
}

上面的程式碼使用 new 運算子來建立兩個 Department 類別的物件,分別呼叫了 context.Department.Add(new Department()); 與 context.Entry(new Department()).State = EntityState.Added; 這兩個敘述,並且呼叫了 SaveChanges 告知 Entity Framework Core 將這筆紀錄新增到資料庫,接著使用了 context.Department.ToList().Count 敘述,顯示出 科系 Department 資料表內究竟有多少筆記錄存在,不用猜想,這裡當然會顯示出僅有2筆紀錄存在。

現在使用了 var departments = context.Department.ToList() 敘述,將科系資料表內的所有紀錄都取回到 .NET 環境內,並且這些紀錄都會在 Entity Framework Core 的變更追蹤系統內有份紀錄,而這裡也會呼叫一個客製方法 Reset(context),這個方法將會清除 ChangeTracker 內的有關科系紀錄,這樣在 Entity Framework Core 內的變更追蹤系統內,就都沒有任何有關科系資料表相關的最新紀錄了。

使用這個敘述 context.Department.Remove(departments[0]) 將第一筆科系紀錄刪除掉,而使用這個敘述 context.Entry(departments[1]).State = EntityState.Deleted 將第二個科系紀錄也刪除掉,這兩種作法都是得到相同的結果。

最後呼叫 context.SaveChanges() 來通知 EF Core 產生 Delete 的 SQL 敘述,讓資料庫刪除這兩筆紀錄,而最後的 Console.WriteLine($"科系記錄數量:{context.Department.ToList().Count}") 敘述,將會得到沒有任何紀錄的輸出結果。

底下是執行結果

科系記錄數量:2
科系記錄數量:0

 



沒有留言:

張貼留言