延續該篇 -
[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 語法
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 的行為是一致的
沒有留言:
張貼留言