DotNetZoom
3.06K subscribers
342 photos
18 videos
36 files
606 links
DotNetZoom
💎 Everything about .NET

ارتباط با مدیر و تبلیغات آگهی استخدام:
@mjebrahimi

لینک گروه ASPNET Core:
https://t.me/+ufG25x7lVFgyYTNk
Download Telegram
#Yeke #ModelBinder #EntityFramework
مشکل ی و ک فارسی و عربی در یک دیتابیس اس کیوال سرور
http://bit.ly/1dx7jL3
یکسان سازی "ی" و "ک" دریافتی در حین استفاده از Entity framework
http://bit.ly/1FOlkym
یکدست کردن "ی" و "ک" در ASP.NET MVC با پیاده‌سازی یک Model Binder
http://bit.ly/1J4MS3A
#Concurrency, #EntityFramework
حل مسائل همزمانی در EF
در حالت کلی دو روش برای حل مسائل همزمانی وجود دارد:
1. Pessimistic Concurrency (Locking)
2. Optimistic Concurrency

در روش اول از database lock استفاده میشود. مثلا برای خواندن یک رکورد از دیتابیس بسته به نیازتان درخواست دسترسی update یا read-only میدهید، که در این صورت اجازه ی lock کردن توسط سایر کاربران برای آن رکورد را میگیرید. اما این روش معایب زیادی دارد و برنامه نویسی را پیچیده میکند و به منابع مدیریتی قوی دیتابیس احتیاج دارد و EF هم به صورت توکار آن را پشتیبانی نمیکند.

اما روش دوم به این معناست که اجازه ی دسترسی همزمان به کاربران را میدهد، ولی اگر این اتفاق بیفتد، عکس العمل مناسب را نشان خواهید داد. مثلا فرض کنید کاربر الف صفحه ی ویرایش را باز میکند و فیلد مورد نظرش را تغییر میدهد، حال قبل از اینکه تغییراتش را ذخیره کند، کاربر ب هم همان صفحه را باز میکند، در ادامه کاربر الف کارش تمام میشود و دکمه ی سیو را میزند و تغییرات در دیتابیس مینشیند، اما به محض ثبت تغییرات از طرف کاربر ب با exception مواجه میشود که این صفحه قبلا ویرایش شده است، در این حالت میشود تعیین کرد که اصلا اجازه ذخیره سازی نداد و یا اینکه با تایید خود کاربر، تغییرات جدید روی قبلی بنشیند و یا اینکه با یک سری روش های پیچیده فهمید کدام فیلدها را کاربر الف ویرایش کرده و اگر مشترک نبود، اجازه ی ذخیره بدهد. اما چیزی که مهم است این است که ما میتوانیم این نوع conflict را با استفاده از EF هندل کنیم، یعنی EF یک اکسپشن از نوع OptimisticConcurrencyException را throw میکند که بعد از آن ما میتوانیم تصمیمان را بگیریم چکار کنیم. برای این منظور هم باید یک سری تنظیمات را روی دیتابیس و مدلمان انجام دهیم، مانند اضافه کردن ستونی از نوع rowversion که هر زمان آپدیت صورت بگیرد، این مقدار به روزرسانی میشود.

تنظیمات دقیق EF را میتوانید از بخش ConcurrencyCheck و Timestamp از لینک زیر مطالعه نمایید:
http://www.dotnettips.info/Post/833/EF-Code-First-3
#EntityFramework #CodeFirst #EFCore
این روزها با نزدیک شدن به زمان انتشار نسخه های نهایی ASP .NET Core 1.0 و EF Core 1.0 و نیز با توجه به تغییرات بنیادی که در ساختار آنها شکل گرفته، ترسی از بابت عدم پشتیبانی از برخی ویژگی های نسخ قبلی، همانند ویژگی Database First در EF Core، در بین توسعه دهندگان ایجاد شده است. در ادامه به تشریح معنای واقعی Code First بودن EF Core و نیز نگرانی بی مورد برخی توسعه دهندگان خواهیم پرداخت.
در ابتدا باید بدانیم مفهوم CodeFirst بودن در EF Core چیست؟ آیا با توجه به عدم پشتیبانی از مدل Database First دیگر نمیتوان از یک دیتابیس موجود و آماده استفاده کرد؟ در پاسخ باید بگوییم خیر این طور نیست. این نسخه، مدل Database First را به مفهموم استفاده از فایل EDMX که یک مدل designer-based است پشتبانی نمیکند و این روش از طرف مایکروسافت منسوخ شده است، اما به هیچ وجه به این مفهوم نیست که نمیشود Database First کار کرد! شما در EF Core 1.0 میتوانید از طریق reverse-engineer، کلاس های POCO و DbContext و Mapping ها را برای دیتابیس خودایجاد کنید و در ادامه Code First کار کنید. حتی برای این منظور و راحتی کار توسعه دهندگان، ابزارهای زیادی به صورت Extension برای ویژوال استودیو در نظر گرفته شده است که از معروف ترین آنها میتوان به EF Power Tools و EntityFramework Reverse POCO Code First Generator اشاره کرد. شاید هم به همین خاطر است که به جای اصلاح Code First که کمی گیج کننده است، اصطلاح Code base یا Code only را برای آن مناسب تر دانسته اند.
مطالب تکمیلی در این باره را میتوانید از طریق لینک زیر، که توسط خانم Julie Lerman و بسیار ساده و روان نوشته شده، مطالعه بفرمایید.

https://msdn.microsoft.com/en-us/magazine/dn890367.aspx
#EntityFramework , #ChangeTracking

وقتی از EF استفاده میکنید. مثلا چیزی Add یا Edit میکنید. EF برای اینکه این تغییرات رو در سمت دیتابیس ذخیره کنه. اول باید بفهمه که چه تغییراتی رخ داده؟! مثلا ایا چیزی Add شده ؟ یا فیلدی ویرایش شده؟ یا شاید شی ای حذف شده. و یا حتی ممکنه شما یه شی رو به کاربر جهت ویرایش نشون بدید ولی کاربر بدون اینکه فیلدی رو تغییر بده رو دکمه "ثبت ویرایش" کلیک کنه. در این حالت حتی EF میفهمه که هیچ تغییری روی این شی انجام نشده. در نتیجه تغییری در سمت دیتابیس هم اعمال نمیکنه.
حالا برای اینکه EF بفهمه این شی شما تغییر کرده یا نه؟ (change tracking یا مکانیزم ردیابی تغیرات) برای این کار از روش اصطلاحا snapshot tracking (تصویر برداری لحظه مثلا) استفاده میکنه.
یعنی وقتی یک شی به context اضافه میشه. میاد و یه نسخه ازش (تصویرش) رو ذخیره میکنه (با مقادیر original ) و به هنگام فراخوانی متد DetectChanges میاد و مقادیر جدید (new value) رو با مقادیر قبلی (original value) مقایسه میکنه و میفهمه که این شی تغییر کرده یا نه. و حتی اینکه کدام فیلد هاش تغییر کره. تا کوئری متناسب با همون تغییرات رو بسازه.
حالا لازم نیست این متد DetectChanges رو خودمون دستی فراخوانی کنیم بلکه با فراخوانی یک سری از متد هایی که در بالا عنوان شده این متد DetectChanges نیز فراخوانی میشه تا این تغییرات رو بفهمه
در EF به این مکانیزم ردیابی تغییرات ChangeTracking گویند. و دیگر هیچ ...

@IranAspMvc
#EntityFramework, #CodeFirst, #Relation
رفع مشکل کلید خارجی در EntityFramework CodeFirst به هنگام ایجاد Relation

توی Entity Framework Code First وقتی از Navigation Property ها استفاده میکنین در واقع ef میفهمه که یک Relation بر قرار کردید. و خودش فیلدی برای Foreingkey با نام زیر در جدول اضافه میکنه
yourfield_ID
حال اگر خودتون به صورت دستی خصوصتی در کلاس مورد نظر به عنوان کلید خارجی تعریف کردید. حتما باید برای EF مخشص کنید که این Property همان Foreignkey مربوط به Relation شماست تا دیگر خود EF فیلدی را به عنوان Foriegnkey در جدول اضافه نکند
برای مشخص کردن کلید خارجی در EF 2 راه دارید.
1- استفاده از ForeignKey Attribute مثال :
public class Books
{
public int CategoryId { get; set; } //Foreign key
[ForeignKey("CategoryId")]
public Category Category { get; set; }
}
2- استفاده از Fluetn Api مثال :
modelBuilder.Entity<Book> ()
.HasRequired(p => p.Category)
.WithMany(p => p.Books)
.HasForeignKey(p => p.CategoryId);
نکته اینکه کد های fluent api باید در متد OnModelCreating نوشته شود.

@IranAspMvc
#Concurrency , #EntityFramework
چه کسی زودتر ظرف میوه را بر می دارد ؟! (همزمانی / Concurrency)
http://www.codeproject.com/KB/aspnet/6WaysLock/1a.JPG

یکی از مواردی که در پروژه های بزرگ حائز اهمیت است مبحث Concurrency یا همزمانی می باشد
فرض کنید دو نفر همزمان از یک حساب بانکی می خواهند پول برداشت کنند و موجودی 200 تومان است
هر دو کارت بانکی خود را وارد کرده و موجودی 200 تومان را مشاهده میکنند. اولی 200 تومان برداشت میکند. و دومی نیز درخواست برداشت 200 تومان از حساب را انجام میدهد
در اینجا باید شرطی گذاشت که اگر موجودی همچنان 200 تومان هست اجازه برداشت به دومی صادر شود و اگر موجودی فعلی 0 شده اجازه برداشت صادر نشود. که در غیر این صورت سیستم بانکی 200 تومان ضرر خواهد کرد.
اگر بخواهیم فنی بررسی کنیم. برنامه نویس ما، برای ویرایش حساب بانکی، علاوه بر آیدی حساب، موجودی فعلی که درزمان ویرایش وجود داشته را به سمت سرور پاس میدهد که در صورت صحت هر دو شرط عملیات آپدیت وانجام شود.
اینجاست شرط عملیات ما صرفا بر پایه آیدی نبوده و شامل پارامتر های دیگری نیز می شود.
مشابه همین مثال در ویرایش همزمان یک پست در یک وبسایت ممکن است رخ دهد
برای حل این مشکل (همزمانی) باید از روش بالا که توضیح داده شد. و یا روش دیگری که Entity Framework تعبیه کرده است به نام RowVersion استفاده کرد
در این روش یک ستون به نام RowVersion که نوع آن byte[] است به جدول شما اضافه میشود. که این فیلد به صورت افزایشی و غیر تکراری به طور خودکار توسط EF مقدار دهی شود
در واقع با هر بار اپدیت این فیلد مقدار جدیدی میگیرد. نشان میدهد که مقادیر این سطر تغییر یافته است. پس به شخص دیگری که در حال آپدیت کردن همین سطر است هشدار میدهد که شخص دیگری همزمان با شما این سطر را ویرایش کرده است. دیگر اجازه ویرایش نمیدهد. همچنین میتوان مقادیر جدید را به شخص نشان داد و یا اینکه چه کسی آن را ویرایش کرده است

آموزش :
http://goo.gl/3LvklT
http://goo.gl/qekRho

@IranAspMvc
#AspMvc, #EntityFramework, #CodeFirst, #Project, #Sample, #Source,

سورس چندین پروژه مختلف که با Asp Mvc و EF و ... نوشته شده در زیر هست.
مرور کد هاش رو به همه پیشنهاد میدم. خیلی مفیده و میتونه بهتون ایده بده

سورس پروژه فروشگاه اینترنتی با AspMVC - EF CodeFirst
http://www.dotnettips.info/projects/details/22
https://github.com/rabbal/My-Golden-City-Shop

طراحی فریمورک برای کار با Asp.net MVC و EF به صورت NTier
http://www.dotnettips.info/projects/details/23
https://github.com/rabbal/Mvc5

سورس پروژه سیستم مدیریت سوابق آموزشی با Asp Mvc
http://www.dotnettips.info/projects/details/27
https://github.com/rabbal/Decision

سورس پروژه سامانه برگزاری مسابقات ورزشی با ASP.NET MVC و AngularJS
http://www.dotnettips.info/projects/details/26
https://github.com/MehdiSaeedifar/SportsSystem

سورس سیستم مدیریت محتوای IRIS
http://www.dotnettips.info/projects/details/13
https://github.com/MehdiSaeedifar/iriscms

سورس پروژه فروشگاه اینترنتی (الکترونیک) با معماری سه لایه
http://www.dotnettips.info/projects/details/2

@IranAspMvc
#EntityFramework, #EFCore, #First_level_cache

می دانیم در EF، هر entity پس از لود شدن، در کش سطح اول خود ذخیره میشود و از آن موقع به بعد، هر زمانیکه EF یک کوئری جهت بازگرداندن آن اِنتیتی اجرا کند، همیشه اِنتیتی ذخیره شده در کش واکشی میشود و EF هیچ تلاشی برای فهمیدن اینکه آیا آن داده ی کش شده با مقدار واقعیِ اجرایِ آن کوئری برابر است یا خیر نمیکند. به عبارت دیگر، اگر شما از طریق فرآیند دیگری دیتابیس را به روز کرده باشید، EF متوجه این قضیه نخواهد شد و این باعث ایجاد ناهماهنگی و مشکل خواهد شد.
اما در چنین سناریوهایی راه حل چیست؟
راه حل این است که در مواقعی که میدانیم داده ی مورد نظر از طریق فرآیند دیگری نیز قابل تغییر است و میخواهیم اِنتیتی کش شده را از دیتابیس لود کنیم، باید ابتدا آن را از طریق Detach کردن از کش سطح اول پاک کنیم و پس از آن با استفاده از متد Reload و به صورت صریح آن را دوباره لود نماییم.
MyEntity e = ...;
ctx.Entry(e).State = EntityState.Detached;

ctx.Entry(e).Reload();

قابل ذکر است که در EF Core متد Reload وجود ندارد و باید به طریق دیگری این مشکل رفع گردد.

منبع :
http://weblogs.asp.net/ricardoperes/entity-framework-pitfalls-entity-refresh
#EntityFramework #Performance #SpeedUp
راه های افزایش سرعت و پرفرمنس Entity Framework
—------------------------------
این باعث میشه که ChangeTracker غیر فعال بشه و برای مواقع Select نمایشی به درد میخوره.
db.Configuration.AutoDetectChangesEnabled = false;
—------------------------------
این درستور هم اخر کوئری هاتون میتونین بنویسید. کار همین بالایی رو انجام میده
db.Users.Select(p => p).AsNoTracking();
—------------------------------
این درستور Validation اعتبارسنجی توکار EF رو غیر فعال میکنه. زمانی از این استفاده کنین که از صحت اطلاعاتتون مطمئن هستید.
db.Configuration.ValidateOnSaveEnabled = false;
—------------------------------
استفاه از Skip و Take جهت صفحه بندی هم باید حواستون باشه
—------------------------------
دونستن فرق بین IQueryable و IEnumerable و اینکه چگونه ازشون استفاده کنیم هم خیلی مهمه (نکته : تمامی فیلتر های where رو قبل از .ToList انجام بدید)
http://www.dotnettips.info/Post/473
—------------------------------
فقط فیلد هایی که نیاز دارین رو توی Select بیارین نه همه فیلد ها
db.Users.Select(p => new { p.Id, p.Username, p.Fullname });
—------------------------------
از چندین dbContext استفاده نکنیم. از الگوی One Context Per Request استفاده کنیم.
—------------------------------
استفاده به جا از Eager loading و Lazy loading هم خیلی مهمه
http://www.dotnettips.info/post/840
—------------------------------
در تراکنش های بالا هر از چندگاهی Context مون رو Dispose کنیم و یا Context جدید ایجاد کنیم. به دلیل ذخیره شدن تمام تراکنش ها در حافظه در تراکنش های بالا با مشکل کمبود حافظه و کندی سرعت مواجه میشوید
—------------------------------
برای افزودن تعداد رکور بالا به صورت همزمان بهتره از BulkInsert استفاده کنین
چندین پلاگین برای اینکار وجود داره. از جمله :
EntityFramework.BulkInsert
EntityFramework.Extended
EntityFramework.Utilities
که بهترین اون ها EntityFramework.BulkInsert هست
http://goo.gl/hXxLvI
—------------------------------

منابع :
https://goo.gl/QW2CBW
http://goo.gl/1ACSwA
http://goo.gl/15ArJO

@IranAspMvc
#EntityFramework, #Repostiry, #UnitOfWork

فایده الگوی Repository (مخزن) جدا سازی لایه ی منطق (Bl) توی پروژه است. یعنی اینکه منطق پروژتون وابسته به ORM یا روش خاصی نیست و توی ریپوسیتوری میتونین اون رو تغییر بدین و توی کل پروژه هم تاثیری نگذاره
فایده الگوی UnitOfWork (واحد کار) جدا سازی Context پروژه است. یعنی ایکه دیگه مثلا حتما الزامی به استفاده از dbContext EF توی پروژه نیست و هروقت خواستین میتونین context رو توی IUnitOfWork عوض کنین و توی پروژه هم تاثیری نگذاره
این که توی پروژه ای که EF استفاده میکنیم، الگوی Repistory یا UnitOfWork رو استفاده بکنیم یا نه. همیشه بین علما اختلاف نظر بوده و هست. و البته بیشتر بر میگرده به نیاز های سیستم تون در آینده...
اینم بگم که عدم استفاده از repostiry و unitofwork در EF (باز هم با توجه به اختلاف نظر علما) اشکالی نداره
اطلاعات بیشتر
http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework/

@IranAspMvc
#Linq, #EntityFramework , #SqlServer
افزونه ای برای LinqPad جهت مشاهده Execution Plan کوئری های Linq
http://www.aboutmycode.com/wp-content/uploads/2016/03/Query-Plan.png

LINQPad.QueryPlanVisualizer
SQL Server query execution plan visualizer for LINQPad.

قابلیت ها:
* View query execution plan
* View missing indexes for query
* Create missing indexes
* Open plan in SQL Server Management Studio or other default app
* Save plan to xml file

http://goo.gl/x9dfEx
https://github.com/Giorgi/LINQPad.QueryPlanVisualizer
http://www.linqpad.net/

@IranAspMvc
#EntityFramework, #CodeFirst, #POCO_Generator
https://goo.gl/w9ylrU

ساخت کلاس های #CodeFirst از روی دیتابیس

افزونه ی EntityFramework Reverse POCO Generator کارش اینه که از روی دیتابیس شما کلاس های Code Frist Poco رو میسازه
به همراه تمام Data Annoutation ها و Configuration Mapping ها
و به درد کسایی میخوره که میخوان دیتابیس آماده شون رو به صورت CodeFrist به یک پروژه متصل کنند.
این افزونه از سال 2013 وجود داشته ولی چیزی که باعث توجه بیشتر و درخشش تو این روزا شده، خبر امدن EF7 و اینکه دیگه از Database First پشتیبانی نمی کنه هست
پس اگه میخواین از EF7 داخل پروژه ای استفاده کنین که دیتابیسش از قبل آماده شده، نگران نباشید
براحتی و در عرض چندثانیه میتونین تمام کلاس های Codefirst اون رو به همراه تمام مشخصات بسازید و توی پروژتون استفاده کنین

این افزونه برای ویژوال استادیو رایگان بوده و در لینک زیر قابل دسترس است
https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838
همچنین سورس کامل آن در گیت هاب در لینک زیر موجود است
https://github.com/sjh37/EntityFramework-Reverse-POCO-Code-First-Generato

@IranAspMvc
#EntityFramework, #EFCore, #LazyLoading

همان طور که میدانیم در اِنتیتی فریم ورک، سه روش برای لود نمودنِ اطلاعات مربوط به یک اِنتیتی وجود دارد. به طور کلی، بر اساسِ این نیاز که آیا برای دریافتِ اطلاعاتِ بینِ جداول، باید 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
#EFCore, #AspNetCore, #EntityFramework

یکی از ویژگی های جالب و البته مفید در نسخه ی جدید اِنتیتی فریمورک (Entity Framework Core) ، اضافه شدن InMemory provider به لیست پروایدرهای آن است. بدین معنی که اِنتیتی فریمورک این قابلیت را دارد که با دیتابیسِ درون حافظه ای نیز کار کند.

با استفاده از این پروایدر میتوانیم بدون تغییرِ کد های برنامه و یا ایجاد کانتکست جدا، برای واحدهای مختلف نرم افزارِ خود، تست های کاربردی بنویسیم.

لینک زیر از این قابلیت در یک برنامه ASP .NET Core API بهره برده است و نشان داده که پس از تستِ متدهای مورد نیاز از طریق دیتابیسِ درون حافظه ای و آماده شدن نرم افزار، فقط با تغییر یک خط کد، امکان سوویچ به پروایدرهای دیگر و یک دیتابیس واقعی مانند SQL Server وجود دارد.

https://stormpath.com/blog/tutorial-entity-framework-core-in-memory-database-asp-net-core

اما در روشی بهتر و مخصوصا در سناریوهایی که نیاز به نوشتن آزمون های واحد (unit testing) برای اجزاء مختلف نرم افزار وجود دارد، برای استفاده از این پروایدر، کافی است در کلاس کانتکست، یک سازنده با پارامتر ورودی DbContextOptions<TContext> قرار داده و در زمانِ ایجادِ کانتکست، در متدهایِ تست، نوع پروایدر را InMemory تعیین کرد.
در این صورت میتوان برای هر کلاس و یا متدِ تست، دیتابیس درون حافظه ای خود را نیز داشت و کنترل بهتری برای تعیین محدوده ی آن دیتابیس اعمال نمود.

https://docs.efproject.net/en/latest/miscellaneous/testing.html

@IranAspMvc
#EF , #EntityFramework , #LazyLoading , #EagerLoading

مساله ی 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
#Xamarin #EntityFramework #EFCore

استفاده از Entity Framework در پروژه های Xamarin

تکنولوژی Entity Framework سالهاست محبوبیت زیادی میان توسعه دهندگانِ دات نت پیدا کرده است. مزایای متعدد و راحتی کار با این ORM سبب شده است که توسعه دهندگان زامارین نیز به فکر استفاده از این تکنولوژی در پروژه های خود باشند. خوشبختانه این امکان با استفاده از Entity Framework Core و پروایدر SQLite آن وجود دارد. مقاله ی زیر به شرح نحوه ی استفاده از این ORM محبوب در یک پروژه ی Xamarin.Android می پردازد و تمامی مراحل را از ابتدا گام به گام به تصویر کشیده است:

http://www.jon-douglas.com/2016/12/28/xamarin-android-entity-framework/

کانال تخصصی AspNet MVC
https://telegram.me/joinchat/BEv5CTyb2T-NYf2E5RZxfA
#EntityFramework #Migration #EF

یکی از امکانات خوب Entity Framework Code First ویژگی مایگریشن (Migration) است که قابلیت همگام سازیِ کلاس های مدلِ برنامه را با پایگاه داده فراهم میکند، از جمله فواید این کار، نگهداری تاریخچه ای از تغییرات اعمال شده روی پایگاه داده است تا در صورتِ لزوم، امکان بازگشت به عقب و یا به یک مایگریشن خاص نیز مهیا باشد.

اما گاهی در برخی موارد پس از پیشرفت پروژه و بزرگ شدن آن، با تعداد زیادی از فایل های مایگریشن رو به رو هستیم، که ممکن است موجب شلوغی و سردرگمی شود و با توجه به تثبت وضعیت پایگاه داده نیازی به نگهداری تمامی آن ها به صورت جداگانه نباشد. خوشبختانه در چنین مواردی امکان حذف و تبدیل تمام مایگریشن ها به تنها یک کلاس مایگریشن، بدون از دست رفتن اطلاعات پایگاه داده وجود دارد.

لینک زیر این مراحل را در چند گام توضیح می دهد:
https://goo.gl/6crh8b

⚠️ توجه کنید که پیش از انجام مراحل گفته شده، از داشتن پشتیبان از پروژه و نیز پایگاه داده ی خود اطمینان حاصل کنید تا در صورت بروز هر گونه مشکلِ پیش بینی نشده، بتوانید به وضعیت قبل بازگردید.

کانال تخصصی AspNet MVC
https://telegram.me/joinchat/BEv5CTyb2T-NYf2E5RZxfA