مشخصات مقاله
-
708
-
0.0
-
4353
-
0
-
0
آموزش ChangeTracker در Entity Framework Core
آموزش ChangeTracker در Entity Framework Core
آموزش ChangeTracker در Entity Framework Core
کلاس DbContext در EF Core حاوی کلاس ChangeTracker است. این کلاس در namespace با نام Microsoft.EntityFrameworkCore.ChangeTracking هست و state موجودیت هایی را که با همان نمونه از DbContext بازیابی شده اند اصطلاحا track می کند. هدف این نیست که در کد مستقیم از آن استفاده کنید چرا که در نسخه های بعدی احتمالا تغییراتی خواهد کرد. با این حال متدهایی برای کار با آن معرفی شده است.
کلاس ChangeTracker در Entity Framework Core به محض بازیابی موجودیت ها شروع به track آن ها می کند، تا زمانی که از scope آن خارج شوند. EF تغییرات را روی همه ی موجودیت ها و property های آن ها دنبال می کند تا بتواند دستور DML مناسب را در منبع داده ی نهایی اجرا کند.
هر موجودیت در هر لحظه یکی از state های زی را دارد که بصورت یک enum از نوع Microsoft.EntityFrameworkCore.EntityState تعریف شده اند:
- Added
- Modified
- Deleted
- Unchanged
- Detached
می خواهیم نحوه ی تغییر خودکار EntityState براساس کارهایی که روی یک موجودیت انجام می شود را بررسی کنیم.
Unchanged State
اولا همه ی موجودیت هایی که با SQL query های مستقیم یا LINQ-to-Entities queriy بازیابی شوند state شان Unchanged است.
public static void Main()
{
using (var context = new SchoolContext())
{
// retrieve entity
var student = context.Students.First();
DisplayStates(context.ChangeTracker.Entries());
}
}
private static void DisplayStates(IEnumerable< EntityEntry > entries)
{
foreach (var entry in entries)
{
Console.WriteLine($"Entity: {entry.Entity.GetType().Name},
State: {entry.State.ToString()} ");
}
}
Output: Entity: Student, State: Unchanged
Added State
همه ی موجودیت هایی که بدون مقدار مناسب key property باشند، توسط متدهای Add() Update() ب DbContext اضافه شده باشند به صورت Added نشانه گذاری می شوند.
using (var context = new SchoolContext())
{
context.Add(new Student() { FirstName = "Bill", LastName = "Gates" });
DisplayStates(context.ChangeTracker.Entries());
}
Output: Entity: Student, State: Added
Modified State
اگر مقداری از یکی از property های یک موچودیت در scope مربوط به DbContext تغییر کرده باشد، به عنوان Modified نشانه گذاری می شود.
using (var context = new SchoolContext())
{
var student = context.Students.First();
student.LastName = "LastName changed";
DisplayStates(context.ChangeTracker.Entries());
}Output: Entity: Student, State: Modified
Deleted State
اگر موجودیتی از با استفاده از متد DbContext.Remove یا متد DbSet.Remove از DbContext حذف شود، با Deleted نشانه گذاری می شود.
Output: Entity: Student, State: Deleted
Detached State
همه ی موجودیت هایی که خارج از scope مربوط به DbContext instance فعلی بازیابی یا ساخته شده اند، در Detached state هستند. اصطلاحا می گوییم موجودیت های disconnected ، موجودیت هایی که با DbContext instance فعلی دنبال نمی شوند.
var disconnectedEntity = new Student() { StudentId = 1, Name = "Bill" };
using (var context = new SchoolContext())
{
Console.Write(context.Entry(disconnectedEntity).State);
}
Output: Detached
در مثال بالا، disconnectedEntity خارج از scope مربوط به DbContext ساخته شده، پس برای آن Detached state قرار دارد..