হ্যাঁ ✅ — default ভাবে DbContext দিয়ে যেকোনো entity query করলে সেটা tracked হয় (যদি তুমি AsNoTracking() ব্যবহার না করো)।
এখন পুরো বিষয়টা পরিষ্কারভাবে বুঝি 👇
🎯 Default Behavior কী?
এই ধরনের query:
var region = await dbContext.Regions
.FirstOrDefaultAsync(x => x.Id == id);
👉 EF Core automatically এটাকে track করে।
মানে:
- Entity memory তে আসে
- DbContext এর Change Tracker এ register হয়
- Property change করলে EF detect করতে পারে
🧠 Tracking মানে কী?
EF Core internally রাখে:
Original Values
Current Values
State (Unchanged / Modified / Added / Deleted)
🔥 Example
var region = await dbContext.Regions.FirstOrDefaultAsync(x => x.Id == id);
region.Name = "NewName";
await dbContext.SaveChangesAsync();
এখানে:
- EF জানে Name change হয়েছে
- UPDATE query generate করবে
❗ কিন্তু কখন track হয় না?
যদি তুমি লিখো:
var region = await dbContext.Regions
.AsNoTracking()
.FirstOrDefaultAsync(x => x.Id == id);
তখন:
❌ EF track করবে না
❌ Property change detect করবে না
❌ SaveChangesAsync() দিলে update হবে না
🧩 Tracking কেন default?
কারণ EF Core assume করে:
তুমি হয়তো entity modify করতে পারো
তাই default behaviour = tracking enabled
🚀 কখন AsNoTracking ব্যবহার করবো?
যখন:
- শুধু read-only data লাগবে
- Update করার দরকার নেই
- Performance improve করতে চাই
Example:
var regions = await dbContext.Regions
.AsNoTracking()
.ToListAsync();
এতে:
✔ Faster query
✔ Less memory use
🧠 Performance Insight
Tracking করলে EF:
- Snapshot রাখে
- Change compare করে
- Memory বেশি লাগে
Large list query করলে AsNoTracking ভালো।
🎯 Summary
| Query Type | Tracking |
|---|---|
| Normal query | ✅ Yes |
| AsNoTracking() | ❌ No |
| Add() | State = Added |
| Remove() | State = Deleted |
⚡ Advanced Insight
DbContext lifetime যদি scoped হয় (যেটা default web request এ হয়),
তাহলে request শেষ হলে tracking context destroy হয়ে যায়।
এখন একটা advanced প্রশ্ন 😄
যদি একই DbContext এ একই Id এর entity দুইবার query করো,
তাহলে কি দুইটা আলাদা object বানাবে?
নাকি same tracked instance return করবে? 🔥