EF Core (Entity Framework Core) 9 adalah ORM framework versi terbaru yang disempurnakan yang ditujukan untuk pengembangan aplikasi berbasis .NET sehingga pengembang dapat bekerja dan mengembangkan aplikasi dalam lingkungan object/class berbasis .NET . EF Core 9 memperkenalkan fitur baru yaitu fungsi ExecuteUpdate dan ExecuteDelete. Fungsi ini memudahkan update dan delete data yang merupakan hasil dari LINQ tanpa perlu dilakukan looping terhadap object satu per satu.
Perhatikan struktur Table SalesPerson dari database AdventureWork2022 berikut ini

Skenarionya adalah, bagaimana jika kita ingin menghapus Sales yang sales-last-year di atas 2000000 dan memberikan bonus 2x lipat ke Sales yang sales-last-year nya di bawah 2000000 ?
Mari kita coba dengan menggunakan cara pemrograman yang biasa digunakan dengan EF Core selama ini. Berikut ini adalah kode yang digunakan untuk update data dan membuat bonus menjadi 2x lipat
var salesJunior = dbContext.SalesPeople.Where(s => s.SalesLastYear <= 2000000).ToList();
salesJunior?.ForEach(sales =>
{
sales.Bonus = 2 * sales.Bonus;
dbContext.SalesPeople.Attach(sales);
dbContext.Entry(sales).State = EntityState.Modified;
});
dbContext.SaveChanges();
Sedangkat berikut ini adalah listing code yang biasa digunakan untuk menghapus data dan menghapus sales yang bonusnya diatas 2000000.
var salesGendut = dbContext.SalesPeople.Where(s => s.SalesLastYear > 2000000).ToList();
salesGendut?.ForEach(sales =>
{
dbContext.SalesPeople.Remove(sales);
dbContext.Entry(sales).State = EntityState.Deleted;
});
dbContext.SaveChanges();
Atau bisa juga menghapus data dengan model kode program RemoveRange berikut ini
var salesGendut = dbContext.SalesPeople.Where(s => s.SalesLastYear > 2000000).ToList();
dbContext.SalesPeople.RemoveRange(salesGendut);
dbContext.SaveChanges();
MENGGUNAKAN EXECUTEUPDATE DAN EXECUTEDELETE
Dengan fitur terbaru dari EF Core 9, kita dapat melakukan LINQ ke database sekaligus melakukan update dan delete menggunakan fungsi ExecuteUpdate dan ExecuteDelete. Skenario query data di atas jika kita terapkan menggunakan ExecuteUpdate maka kode programmnya akan berubah menjadi seperti berikut
dbContext.SalesPeople.Where(s => s.SalesLastYear <= 2000000)
.ExecuteUpdate(s =>
s.SetProperty(prop => prop.Bonus, prop => (2 * prop.Bonus))
);
Dan jika kita mengubah model kode program untuk hapus data menggunakan ExecuteDelete maka, kode programmnya menjadi seperti berikut
dbContext.SalesPeople.Where(s => s.SalesLastYear > 2000000).ExecuteDelete();
Perlu dicatat bahwa penggunaan ExecuteDelete dan ExecuteUpdate berbeda dengan menggunakan strategi SaveChanges karena ExecuteDelete dan ExecuteUpdate tidak akan menggunakan change tracking. ExecuteUpdate dan ExecuteDelete akan langsung mengirimkan query update atau query delete ke database dan akan melewati change tracking perubahan object yang ada di Entity Framework. Hal ini karena hasil dari ExecuteUpdate dan ExecuteDelete bisa berefek pada banyak row sekaligus sehingga susah dilakukan tracking object mana yang berubah. Sehingga sebaiknya diusahakan untuk tidak menggabungkan model kode antara SaveChanges dan ExecuteUpdate terhadap tabel yang sama.