کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش کار با ChangeTracker.TrackGraph در Entity Framework Core

آموزش کار با ChangeTracker.TrackGraph در Entity Framework Core

در بخش قبل دیدیم چگونه متدهای مختلف تاثیر متفاوتی روی EntityState هر موجودیت در گراف موجودیت دارند. در این بخش یاد می گیریم چگونه هر موجودیت در گراف موجودیت را track کنیم و به طور مستقل EntityState آن ها را تغییر دهیم.

متد ChangeTracker.TrackGraph() در Entity Framework Core معرفی شد و برای track کردن کل گراف موجودیت و مقداردهی به state هر موجودیت به طور مستقل به کار می رود.

متد به صورت public virtual void TrackGraph(object rootEntity, Action callback) تعریف شده است.

متد ChangeTracker.TrackGraph() شروع به track کردن موجودیت root و هر موجودیتی که طریق پیمایش navigation property های آن قابل دسترس باشد، می کند. callback تعیین شده برای هر موجودیتی که طی این فرایند پیدا شود فراخوانی می شود و برای هر موجودیت یک EntityState مناسب ست می شود. تابع callback به ما امکان پیاده سازی منطق مورد نظرمان برای مقداردهی به state موجودیت ها را می دهد. اگر state تعیین نشود، موجودیت untracked باقی می ماند.

مثال زیر کار متد TrackGraph را نشان می دهد:


 var student = new Student() { //Root entity (with key value)
    StudentId = 1,
    Name = "Bill",
    Address = new StudentAddress()  //Child entity (with key value)
    {
        StudentAddressId = 1,
        City = "Seattle",
        Country = "USA"
    },
    StudentCourses = new List< StudentCourse >() {
            new StudentCourse(){  Course = new Course(){ CourseName="Machine Language" } },//Child entity (empty key)
            new StudentCourse(){  Course = new Course(){  CourseId=2 } } //Child entity (with key value)
        }
};
       
var context = new SchoolContext();
            
context.ChangeTracker.TrackGraph(student, e => {
                                                if (e.Entry.IsKeySet)
                                                {
                                                    e.Entry.State = EntityState.Unchanged;
                                                }
                                                else
                                                {
                                                    e.Entry.State = EntityState.Added;
                                                }
                                            });
foreach (var entry in context.ChangeTracker.Entries())
{
    Console.WriteLine($"Entity: {entry.Entity.GetType().Name}, 
                        State: {entry.State.ToString()} ");
}


Output:
Entity: Student, State: Added 
Entity: StudentAddress, State: Unchanged
Entity: StudentCourse, State: Added 
Entity: Course, State: Added 
Entity: StudentCourse, State: Added 
Entity: Course, State: Unchanged

در مثال بالا، متد ChangeTracker.TrackGraph() برای مقداردهی به state هر موجودیت در گراف موجودیت student استفاده شده. اولین پارامتر یک گراف موجودیت است و پارامتر دوم یک تابع است که state هر موجودیت را مقداردهی می کند. ما از یک lambda expression برای مقداردهی به state موجودیت ها استفاده کرده ایم. موجودیت هایی که مقدار صحیحی برای key خود دارند Unchanged و موجودیت هایی که key value ندارند Added می شوند. IsKeySet هنگامی true می شود که یک موجودیت مقدار صحیحی برای key property خود داشته باشد.

1398/06/26 2362 0
نظرات شما

نظرات خود را ثبت کنید...