#EntityFramework, #EFCore, #LazyLoading
همان طور که میدانیم در اِنتیتی فریم ورک، سه روش برای لود نمودنِ اطلاعات مربوط به یک اِنتیتی وجود دارد. به طور کلی، بر اساسِ این نیاز که آیا برای دریافتِ اطلاعاتِ بینِ جداول، باید Join صورت پذیرد یا خیر، نوع واکشی را مشخص میکنیم.
برای این منظور سه الگوی مشترک بین ORM ها به قرار زیر است:
- Eager loading
- Explicit loading
- Lazy loading
بسته به نوع نیاز ممکن است هر یک از روش های فوق مورد استفاده قرار گیرند.
در EF Core هم به صورت مشابه، رویه به همین منوال برقرار است، با این تفاوت که فعلا خبری از Lazy loading نیست و باید به طور واضح، اِنتیتی فریمورک را نسبت به لود دیتای مورد نیاز از طریق include آگاه نمود.
هم چنین واکشی اطلاعات تا چند سطح از طریق متد
فیلم زیر در channel 9 از سری مجموعه های ASP .NET Monsters Episode این قابلیت را به صورت عملی شرح میدهد:
https://channel9.msdn.com/Series/aspnetmonsters/ASPNET-Monsters-Episode-57-Loading-Related-Data-with-Entity-Framework-Core
@IranAspMvc
همان طور که میدانیم در اِنتیتی فریم ورک، سه روش برای لود نمودنِ اطلاعات مربوط به یک اِنتیتی وجود دارد. به طور کلی، بر اساسِ این نیاز که آیا برای دریافتِ اطلاعاتِ بینِ جداول، باید Join صورت پذیرد یا خیر، نوع واکشی را مشخص میکنیم.
برای این منظور سه الگوی مشترک بین ORM ها به قرار زیر است:
- Eager loading
- Explicit loading
- Lazy loading
بسته به نوع نیاز ممکن است هر یک از روش های فوق مورد استفاده قرار گیرند.
در EF Core هم به صورت مشابه، رویه به همین منوال برقرار است، با این تفاوت که فعلا خبری از Lazy loading نیست و باید به طور واضح، اِنتیتی فریمورک را نسبت به لود دیتای مورد نیاز از طریق include آگاه نمود.
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ToList();
هم چنین واکشی اطلاعات تا چند سطح از طریق متد
ThenInclude
باید انجام شود و برخلاف EF6 که واکشی چند سطحی در متد include و به وسیله ارسال پارامتر از نوع استرینگ (Include("Posts.Comments")
) صورت میگرفت در نسخه ی کور باید از متد ThenInclude
استفاده گردد:var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Comments)
.ToList();
فیلم زیر در channel 9 از سری مجموعه های ASP .NET Monsters Episode این قابلیت را به صورت عملی شرح میدهد:
https://channel9.msdn.com/Series/aspnetmonsters/ASPNET-Monsters-Episode-57-Loading-Related-Data-with-Entity-Framework-Core
@IranAspMvc
Channel 9
ASP.NET Monsters #57: Loading Related Data with Entity Framework Core
Entity Framework Core doesn't support lazy loading yet which means you need to explicitly tell Entity Framework what related data to include when querying for an entity. In today's episode, Monster Da
#EF , #EntityFramework , #LazyLoading , #EagerLoading
مساله ی Select N+1 چیست و چطور باعث کاهش کارایی ORM می شود؟
استفاده از تکنولوژی های جدید به همان اندازه که میتواند به کمک توسعه دهنده بیاید و یک کدنویسیِ راحت و لذت بخش را برای وی رقم بزند، به همان اندازه هم در اثر دانش کم و استفاده ی نادرست می تواند مخرب باشد، مخصوصا اگر موضوعِ تکنولوژی، ارتباط مستقیمی با پرفرمنس و کارایی برنامه ی شما داشته باشد.
یکی از مشکلات و خطاهای رایج در استفاده از EF، خطای select n+1 است، که به وفور در کدهای توسعه دهندگانِ ناوارد یافت می شود. به این معنی که شما به جای اجرای یک کوئری، n+1 کوئری را اجرا میکنید و در نتیجه ی آن، n+1 رفت و برگشت به بانک اطلاعاتی خواهید داشت! و این مشکل به دلیل فعال بودن خاصیت lazy loading و اجرای حلقه روی مجموعه ای از داده ها که دارای رابطه ی master-detail هستند، اتفاق می افتد. به عنوان مثال تصور کنید یک کلاس Department داریم و هر دپارتمان هم تعدادی Course دارد:
در این صورت، با اجرای حلقه ی زیر و فعال بودن خاصیت lazy loading مشکل select n+1 به وجود می آید:
بنابراین، در حالتی که با تعداد بالایی داده رو به رو باشیم، استفاده ی نادرست از lazy loading به شدت روی پرفرمنس تاثیر گذار است. راه حل این مشکل استفاده از متد Include برای اعمالِ جوینِ بین جدوال است، تا اطلاعاتِ موجودیت های مرتبط به صورت همزمان و از طریق Eager loading واکشی شوند:
در این حالت فقط یک رفت و برگشت به بانک اطلاعاتی خواهیم داشت و EF خودش Join لازم را برای واکشیِ اطلاعاتِ مرتبط، در پشت صحنه انجام می دهد.
اطلاعات بیشتر:
http://www.codeproject.com/Articles/102647/Select-N-Problem-How-to-Decrease-Your-ORM-Perfor
@IranAspMvc
مساله ی Select N+1 چیست و چطور باعث کاهش کارایی ORM می شود؟
استفاده از تکنولوژی های جدید به همان اندازه که میتواند به کمک توسعه دهنده بیاید و یک کدنویسیِ راحت و لذت بخش را برای وی رقم بزند، به همان اندازه هم در اثر دانش کم و استفاده ی نادرست می تواند مخرب باشد، مخصوصا اگر موضوعِ تکنولوژی، ارتباط مستقیمی با پرفرمنس و کارایی برنامه ی شما داشته باشد.
یکی از مشکلات و خطاهای رایج در استفاده از EF، خطای select n+1 است، که به وفور در کدهای توسعه دهندگانِ ناوارد یافت می شود. به این معنی که شما به جای اجرای یک کوئری، n+1 کوئری را اجرا میکنید و در نتیجه ی آن، n+1 رفت و برگشت به بانک اطلاعاتی خواهید داشت! و این مشکل به دلیل فعال بودن خاصیت lazy loading و اجرای حلقه روی مجموعه ای از داده ها که دارای رابطه ی master-detail هستند، اتفاق می افتد. به عنوان مثال تصور کنید یک کلاس Department داریم و هر دپارتمان هم تعدادی Course دارد:
public class Department
{
....
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
....
public virtual Department Department { get; set; }
}
در این صورت، با اجرای حلقه ی زیر و فعال بودن خاصیت lazy loading مشکل select n+1 به وجود می آید:
using (var context = new SchoolEntities())
{
foreach (var department in context.Departments)
{
foreach (var course in department.Courses)
{
Console.WriteLine("{0}: {1}", department.Name, course.Title);
}
}
}
بنابراین، در حالتی که با تعداد بالایی داده رو به رو باشیم، استفاده ی نادرست از lazy loading به شدت روی پرفرمنس تاثیر گذار است. راه حل این مشکل استفاده از متد Include برای اعمالِ جوینِ بین جدوال است، تا اطلاعاتِ موجودیت های مرتبط به صورت همزمان و از طریق Eager loading واکشی شوند:
using (var context = new SchoolEntities())
{
foreach (var department in context.Departments.Include("Courses"))
{
foreach (var course in department.Courses)
{
Console.WriteLine("{0}: {1}", department.Name, course.Title);
}
}
}
در این حالت فقط یک رفت و برگشت به بانک اطلاعاتی خواهیم داشت و EF خودش Join لازم را برای واکشیِ اطلاعاتِ مرتبط، در پشت صحنه انجام می دهد.
اطلاعات بیشتر:
http://www.codeproject.com/Articles/102647/Select-N-Problem-How-to-Decrease-Your-ORM-Perfor
@IranAspMvc
Codeproject
Select N+1 Problem – How to Decrease Your ORM Performance - CodeProject
This post will introduce the select N+1 pitfall and explain how to avoid it in Entity Framework.; Author: Gil Fink; Updated: 18 Aug 2010; Section: Database; Chapter: Database; Updated: 18 Aug 2010