• 1397/06/27

Entity Framework Core Ef Core :

اکثر برنامه نویس ها هم برنامه شون رو با حجم دیتای کم که خودشون دستی می زنن تست می کنن و حجم دیتای زیاد تازه چند ماه بعد از اولین Release روی Production به وجود میآد. تازه ما می فهمیم که داستان چی بوده. و تازه باید بریم و کوئری هامون رو بررسی کنیم و ببینیم چه باید کرد برای تک تک شون. تو اون مرحله اعمال تغییرات واقعا سخته، شاید اگه ما می دونستیم اصلا Data Model رو جور دیگه ای طراحی می کردیم و از اول مسیر دیگه ای رو می رفتیم. برای مثال این کوئری رو به صورت Sql می نوشتیم:

context.Customers.FromSql("select * from Customers where DATENAME(weekday,BirthDate) = 'Friday'")

که به درستی کار می کنه و همچنین IQueryable بر می گردونه. یعنی کد زیر کاملا مورد انتظار ما کار خواهد کرد:

context.Customers.FromSql("select * from Customers where DATENAME(weekday,BirthDate) = 'Friday'").OrderBy(c => c.BirthDate).Take(10).Skip(10)

این یعنی ترکیب Linq & Sql که خیلی کاربردی است.

اما چه کنیم که وقتی EF Core نمی تواند به صورت کامل کوئری رو تجزیه و تحلیل کرده و تبدیل به Sql کند، به ما خطا دهد؟ پاسخ در قسمت زیر هست:

https://docs.microsoft.com/en-us/ef/core/querying/client-eval#disabling-client-evaluation

در پروژه های مبتنی بر Bit داریم: 

    public class MyAppDbContextObjectsProvider : SqlServerDbContextObjectsProvider
    {
        public override void UseDbConnection(DbConnection dbConnection, DbContextOptionsBuilder dbContextOptionsBuilder)
        {
dbContextOptionsBuilder.UseSqlServer(dbConnection)
                .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning)); // important part.
        }
    }

و در AppStartup.cs  داریم:

dependencyManager.RegisterEfCoreDbContext<MyAppDbContext, MyAppDbContextObjectsProvider>();

که MyApp در اینجا نام پروژه شما و MyAppDbContext هم DbContext‌ پروژه شماست.

با توجه به ضربه های شدیدی که پروژه های متعدد از این مسئله خورده اند، تصمیم بر آن شد که در نسخه بعدی Bit این تنظیم به صورت «پیش فرض» اعمال شود.

یه آموزشی میدیدم از خانم جولی لرمن
ایشون همین نکته رو اشاره کردن ولی از زاویه دیگه
میگفتن که از خوبی های ورژن کور انتیتی فریم ورک اینه که اگر کوئری هایی که تو سی شارپ نوشته میشه رو نتونه به زبان اس کو ال ترجمه کنه  نمیاد ارور بده
بلکه توی حافظه بارگذاری ش میکنه
من فکر میکردم این یه مزیته
نگو به وقت بزنگاه میتونه بیچاره کنه
مهندس این تویە جای خوندم   این حقیقت دارە  یا نە

جون من میخوام  اینو یاد بگیرم  همینجوری خودتون فرمودید خوبە  

باید ببخشی من دانشم خیلی خیلی کمە تازە دارم یاد میگیرم  اگە سوالم  اشتباە است یا درست نیست باید بە بزرگی خوت منو ببخشی 

  • 1397/06/27
  • ساعت 12:46

سلام 

مسئله جالبی بیان کردید 

در جلسات بعدی حتما راجع بهش صحبت خواهم کرد 

 


logo-samandehi