"> Lazy Loading توسط EF Core | آموزش NET Core. | ام اس پی سافت

Lazy Loading توسط EF Core

Lazy Loading

در این مقاله میخواهیم راجب Lazy Loading توسط EF Core صحبت کنیم.

این روزها از Dapper بعنوان ORM دسترسی به داده استفاده می شود، فقط به این دلیل که آنرا بسیار آسان تر از کار با ترکیب مناسب صحیح از نگاشت های روان یافت که واقعا هر آنچه که می خواهیم به ما میدهد.

چرا هسته EF عملکرد بارگیری کند تا نسخه ۲.۱ نداشته است؟

شما در حال حاضر باید با Entity Framework و تمام مهاجرتهای خود به آسانی در حال کار باشید.

این فقط یک معامله از نوع «چطور Lazy Loading در هسته Entity Framework انجام دهید اگر به آن نیاز داشتید» می‌باشد.

نخست اینکه، هسته EF خودش عملکرد Lazy Loading خارج از جعبه ندارد.

ابتدا لازم است بسته دیگری را نصب کنید. بنابراین در پروژه تان لازم است دستور زیر را در کنسول مدیریت بسته خود اجرا کنید:

Install-Package Microsoft.EntityFrameworkCore.Proxies

من اکیدا توصیه میکنم که دقیقا همان نسخه بسته proxies مطابق با نسخه Entity Framework ی که استفاده می‌کنید نصب کنید.

در غیر این صورت وقتی که پروژه proxies را نصب می‌کنید، هم‌زمان نسخه EF شما را به‌روز رسانی می‌کند که در اکثر موارد می‌خواهید از آن اجتناب کنید.

سپس، بسته به جایی که context پایگاه داده DB خود را پیکربندی می کند.

اگر در فایل startup.cs است ، پس کافی است که یک فراخوانی به UseLazyLoadingProxies() مانند زیر داشته باشید:


services.AddDbContext<MyContext>(options =>
{
 options.UseSqlServer().UseLazyLoadingProxies();
}

اگر شما همه چیز را در context واقعی خود پیکربندی می‌کنید، پس اساسا می‌توانید همان کار را با options builder انجام دهید:


protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
 optionsBuilder.UseLazyLoadingProxies();
}

حال وقتی پروژه خود را اجرا می‌کنید، در هر ۱۰ اجرا ۹ بار خروجی زیر را می‌دهد:

این بدین دلیل است که تمام ویژگی های navigation باید به عنوان virtual نشانه گذاری شود، بنابراین برای مثال من باید کلاس خودم را به این صورت تغییر دهم :


public class MyEntity
{
[...]
    public virtual AnotherEntity MyNavigationProperty {get;set;}
}

کلید واژه virtual به EF اجازه می‌دهد تا ویژگی ها را بازنویسی کرده و داده ها موقع فراخوانی واکشی شوند.

این کمی با Entitty Framework در .NET کامل متفاوت است.

می‌دانید که نمی‌توانید چیزی را بعنوان virtual نشانه گذاری کنید اگر بخواهید یک ویژگی navigation داشته باشید فقط وقتی که از “include” با LINQ استفاده می‌کنید.

اما این در اصل اجرا می‌شود.

اگر Lazy Loading را فعال کنید، تمام ویژگی های navigation (برای مثال غیرابتدایی‌ها) لازم است مجازی باشد
برای من تا حدودی معقول است.

و اگر شما نگران افرادی هستید که از ویژگی navigation استفاده می‌کنند که مقدار بسیار زیادی داده بارگیری خواهد کرد، آنگاه اساسا به چند چیز جوش می‌خورد:

  • اصلا از بارگیری کند استفاده نکنید
  • ویژگی‌های navigation در وظایفی که می‌تواند منجر به بارگیری داده بزرگ شود را حذف کنید
  • لایه مخزن خود را طوری بنویسید که استفاده از جملات include را ترغیب کند/ مشتاق بارگیری در هر جای ممکن باشد، و بارگیری کند استثناء در قاعده باشد.

مایکروسافت همچنین روشی برای Lazy Loading  بدون استفاده از بسته proxies دارد.

اما آن بسیار بالاتر از بالا به نظر می‌رسد و به جای آن احتمالا مشتاق بارگیری شوید.

  • پسورد: www.mspsoft.com
زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

کدیشن ! مارکت پروژه های برنامه نویسی راه اندازی شدیه توکه پا بریم ببینم