Web Devs
641 subscribers
218 photos
22 videos
17 files
233 links
Articles, News, Jokes, Quotes, Back-End and UI/UX for web developers.
Github : https://github.com/fullStackDevsGroup
Advertising: @adsfullStackDevs
Download Telegram
#ICollection - #IEnumarable - #IList - #DynamicProxy #LazyLoading - #NavigationProperty - #EF - #DistributedCache #Poco - #ChangeTracking



درباره Dynamic Proxy یا Lazy Loading

قطعا یکی از مهمترین نکات در استفاده از ORM ها و بهبود عملکرد ORM ها برای هرگونه نگاشت یا ارتباط با پایگاه داده استفاده ی ORM از Dynamic Proxy ها است.
داینامیک پراکسی ها به طور گسترده و توسعه یافته درORM اختصاصی شرکت اوراکل برای جاوا یا همان هایبرنت (در انگلیسیHibernate) استفاده شد ، بعد ها مایکروسافت به دلیل پرکاربرد بودن Dynamic Proxy ها تصمیم به ورود آن ها در C# و هسته دات نت کرد ، و پس از استفاده موفق و گرفتن فید بک های مثبت از توسعه دهنگان تصمیم به استفاده از Dynamic Proxy در EF کرد (البته مایکروسافت در ADO.NET از POCO Proxy استفاده کرده بود که بی شباهت به Dynamic Proxy ها نبود) ولی به هر صورت داینامیک پراکسی ها به EF اضافه شدند ، شاید برای شما هم سوال پیش آمده باشد که چرا مایکروسافت در نمونه های استاندارد خود در MSDN و Blog سایت Aspnet از اینترفیس ICollection برای ایجاد ارتباطات Many-To-Many و One-To-Many استفاده کرده است ، اگر بخواهید از Dynamic Proxy ها در EF استفاده کنید ملزم به رعایت چند نکته خواهید بود :
1 - استفاده از کلاس های Public و عدم استفاده از کلاس های Static و Sealed
2- استفاده از Property های دارای Get , Set با پیشوند Virtual (عدم استفاده از پراپرتی های Read&Write Only)
3 - استفاده از ICollection برای Navigation Properties در کلاس ( حتما باید از این Interface استفاده شود)

استفاده از Dynamic Proxy ها اگر چه فواید زیادی دارند ، ولی در بسیاری از موارد کارایی سیستم را نیز کم خواهند کرد ، (به عنوان مثال در استفاده از Distributed Caching در EF ، که خود این مبحث کاربرد فراوان ازجمله (بالا بردن پرفورمنس EF و قابلیت اطمینان و...) را دارند.
استفاده از Dynamic Proxy ها بیشتر در Lazy Loading و Chnage Tracking کاربرد دارند.

ولی به هرسو اگر نیاز به استفاده از Dynamic Proxy ها دارید نباید در Navigation Property های روابط در EF از List<> برای ایجاد کالکشن استفاده کنید و باید این کار را با ICollection انجام دهید.برای عدم استفاده از Dynamic Proxy ها نیز باید از با دستور زیر اقدام به غیر فعال سازی این ویژگی کنید.

Configuration.ProxyCreationEnabled = false;

در آخر ذکر این نکته ضروری به نظر میرسد که استفاده از Dynamic Proxy ها برای استفاده از LazyLoading ضروری است اگر چه میتوان به صورت دستی Lazy Loading رو فعال کرد.

@ArmanAbi
#EF_Core3
#FromSqlRaw
#ExecuteSqlRaw
🔹 بررسی تغییرجدیدی که از preview 4 بروی EF Core 3.0 اعمال شده است.
در نسخه های قبلی از این متد FromSql برای اجرای یک raw SQL query به صورت مستقیم استفاده میشد.
اما در نسخه جدید (3.0) از متد های

FromSqlRaw ، ExecuteSqlRaw ExecuteSqlRawAsync

برای اجرای یک raw SQL query که پارامتر های آن به صورت جدا در کوئری استرینگ مقدار دهی میشوند، استفاده میشوند.این متد ها جایگزین متد FromSql شده اند.

context.Products.FromSqlRaw(
"SELECT * FROM Products WHERE Name = {0}",
product.Name);

همچنین از متدهای

FromSqlInterpolated, ExecuteSqlInterpolated, ExecuteSqlInterpolatedAsync

برای اجرای یک raw SQL query استفاده میشوند با این تفاوت که در این متدها پارامتر های کوئری در مابین کوئری استرینگ و نه به صورت جدا مقداردهی میشوند.

context.Products.FromSqlInterpolated(
$"SELECT * FROM Products WHERE
Name = {product.Name}"
);

تغییر دیگری که در نسخه جدید اتفاق افتاده است محل صدا زدن این متد هاست. در نسخه های قبل تر از (3.0 )متد FromSql را در هر جای کوئری لینک خود میتوانستید صدا بزنید اما از در نسخه جدید متد های جایگزین شده را فقط مستقیما بروی DbSet<> می توانید صدا بزنید.
هدف از انجام این تغییر هم فقط برای جلوگیری از ابهام در کوئری، آن هم در سناریوهای خاص بوده است.

@fullStackDevs