ردیابی فراخوانی ها با تگ کوئری در Entity Framework
شنبه 2 شهریور 1398یکی از مشکلات Entity Framework موفق نبودن در ردیابی اپلیکیشن صادر کننده SQL است، در این مطلب قصد داریم بیشتر درباره این مشکل Entity Framework صحبت کنیم.
چند سال گذشته از زندگی من با Entity Framework گذشته است، من در طول این سال ها تعداد زیادی DBA( سرورهای بانک اطلاعاتی) را اجرا کرده ام که Entity Framework اصلا علاقه ای به آن ها ندارد.
یکی از مهم ترین مشکلات Entity Framework
یکی از مهمترین دلایلی که بسیاری از افراد Entity Framework را دوست ندارند به این دلیل است که آن ها در حین استفاده از LINQ هیچ گونه کنترلی ندارند و به نظر من نمی تواند یک روش کارآمد برای بازیابی اطلاعات باشد.
البته من دلیل دیگری نیز برای نداشتن علاقه به این موضوع می توانم برای شما ارائه دهم:
- خواندن سخت و درهم SQL
- بازیابی به صورت تک ستونه از هر کوئری
- نمی داند که کدام اپلیکیشن این SQL را ارسال کرده است
یک نکته مهم درباره Entity Framework
سومین موردی که بیان کردم اصلی ترین دغدغه من در هنگام کار کردن با DBA در طول این سال ها بوده است. تهاجم های زیادی به Entity Framework صورت گرفته است چرا که اگر برای یک کوئری مشکلی به وجود می آمد هیچ راهی وجود نداشت که به دیتابیس بگویید که این کوئری از کدام یک از اپلیکیشن ها گرفته شده است و در واقع هیچ دستوری برای انجام این کار وجود نداشت.
امروزه روش های مختلفی برای انجام این کار وجود دارد که از جمله آنها می توان به اجرا و ذخیره به صورت رویه ای توسط این فریم ورک به عنوان یک مورد ساده اشاره کرد.
حال بهتر است شما نیز کمی فکر کنید، چگونه می توانید بگویید که کدام برنامه دستور SQL را ارسال کرده است؟
وارد کردن تگ های کوئری
در این جا یک خبر خوب و یک خبر بد وجود دارد.
خبر خوب این است که تگ های کوئری در نسخه Entity Framework Core 2.2 معرفی شدند.
خبر بد این است که شما از آن تنها در Entity Framework Core 2.2 و یا نسخه های بالاتر می توانید استفاده کنید. این ویژگی می توانست یک ویژگی فوق العاده در نسخه های قبلی این فریم ورک باشد.
تگ های کوئری یک ویژگی جدید EF Core 2.2 هستند که دقیقا همان چیزی هستند که شما از آن ها انتظار دارید. این ویژگی در واقع زمانی که یک کوئری به دیتابیس ارسال می شود کامنت هایی را به SQL شما اضافه می کند.
به عنوان مثال کوئری زیر را در نظر بگیرید:
var nearestFriends = (from f in context.Friends.TagWith("This is my spatial query!") orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList();
دستور .Tag With() در واقع کامنت خاصی را به کوئری که به دیتابیس ارسال شده است اضافه می کند تا این موضوع که کدام اپلیکیشن دستور SQL را صادر کرده است را محدود کند که این موضوع شامل موارد زیر است:
- نام اپلیکیشن و نسخه استفاده شده از آن
- نام متدی که این دستور را ارسال کرده است
- لیست پارامترهای موجود
- نام کاربری که این دستور را ارسال کرده است
به همین علت است که من هیچ گاه یک تمبر زمان و یا تاریخ را به این شکل ارسال نمی کنم چرا که این موارد در هنگام کار کردن و اجرای دستورات به صورت خودکار ذخیره می شود.
یکی از مهم ترین محدودیت های تگ های کوئری این است که آن ها قابل تنظیم نیستند و به همین علت تنها ورودی هایی از نوع رشته را دریافت می کنند.
نتیجه گیری
با استفاده از تگ های کوئری DBA ها دقیقا می دانند که مشکل از کجا به وجود آمده است و به راحتی نقطه به وجود آمدن مشکل را با استفاده از کامنت های کوئری پیدا می کنند. هر چه قدر که شما اطلاعات بیشتری را به همراه کوئری خود ارسال کنید می توانید بیشتر مطمئن باشید که DBA برای مدت زمان طولانی تری برنامه شما را اجرا می کند و احتمال این که نتواند مشکلات به وجود آمده را حل کند پایین تر می آید.
این نکته بسیار کوتاه ولی مهم دلیل خوبی به توسعه دهندگانی که Entity Framework را دوست ندارند می دهد تا به این فریم ورک علاقه مند شوند.
- برنامه نویسان
- 1k بازدید
- 1 تشکر