星期五, 8月 16, 2019

[EF] RemoveRange

延續該篇 - [EF] identity 產生的資料,現在來觀察 Remove() 和 RemoveRange() 大量刪除時,是如何產生 TSQL 來進行作業刪除作業
namespace EFIdentity
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SchoolContext context = new SchoolContext())
            {

                // 不用在意刪除順序,DbContext 會自行判斷
                var personalData = context.Person.Where(p => p.PersonID == 1074 || p.PersonID == 1075).ToList();
                context.Person.RemoveRange(personalData);
                var studentGradeData = context.StudentGrade.Where(s => s.StudentID == 1074 || s.StudentID == 1075).ToList();
                context.StudentGrade.RemoveRange(studentGradeData);

                // 透過 SaveChange() 進行資料刪除
                context.SaveChanges();

            }
        }
    }
}
SQL Profile 錄 TSQL 語法

[EF] RemoveRange
exec sp_executesql N'DELETE [dbo].[StudentGrade]
WHERE ([EnrollmentID] = @0)',N'@0 int',@0=68
go
exec sp_executesql N'DELETE [dbo].[StudentGrade]
WHERE ([EnrollmentID] = @0)',N'@0 int',@0=69
go
exec sp_executesql N'DELETE [dbo].[StudentGrade]
WHERE ([EnrollmentID] = @0)',N'@0 int',@0=70
go
exec sp_executesql N'DELETE [dbo].[Person]
WHERE ([PersonID] = @0)',N'@0 int',@0=1075
go
結論
  • SaveChange() 會自行決定刪除資料順序,不須要刻意先刪除 Detail Table 再去刪除 Master Table
  • 雖然是利用 RemoveRange() 來移除資料,但是還是根據 Table PK 一筆一筆產生 Delete 語法,這一點跟 VFP CursorAdapter 的行為是一致的

沒有留言:

張貼留言