آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش 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 قرار دارد..

  • 268
  •    100
  • تاریخ ارسال :   1398/06/26

دانلود سورس کد دانلود فیلم آموزشی دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .