PDA

View Full Version : پراپرتی Local در Entity FrameWork



negar.rafie
دوشنبه 01 شهریور 1395, 10:58 صبح
سلام
دوستان مورد اصلی استفاده از Local چی هستش؟کلا برای چی هستش
و سوال بعدی ایا قط برای لود هستش یا نه برای ذخیره ،ویرایش و حذف هم میشه ازش استفاده کرد

مثلا کد زیر برای حذف هستش
از کدوم باید استفاده کنیم؟فرقشون چیه؟

var u = db.tbl1.Local.Where(c => c.code == "100").FirstOrDefault();
db.tbl1.Local.Remove(u);

var u = db.tbl1.Where(c => c.code == "100").FirstOrDefault();
db.tbl1.Remove(u);

Mahmoud.Afrad
دوشنبه 01 شهریور 1395, 13:28 عصر
این پراپرتی از نوع ObservableCollection<TEntity> و in-memory هست یعنی در حافظه(ram) قرار میگیره.
برای استفاده از Local بایست حداقل یکبار قبلا متد Load را فراخوانی کرده باشید.
برای لود داده هایی با شرط خاص ، اعمال شرط را قبل از متد Load انجام بدید(db.tbl1.Where(...).Load())
با فراخوانی چندباره متد Load داده های جدید با داده های قبل در Local تجمیع خواهند شد.
با توجه به اینکه هر تغییری اعم از حذف، اضافه و آپدیت روی Local بر روی DBContext اعمال میشه ، و البته تا زمانی که متد SaveChanges فراخوانی نشه، روی دیتابیس اعمال نخواهد شد، میتونه یک گزینه خوب برای data binding باشه.
اگر نیازی به data binding نیست، در اینصورت لود داده در Local برای Remove غیرمنطقی هست. مگر قبلا لود شده باشه.
با توجه به لینکهای زیر ObservableCollection برای مجموعه های بزرگ پرفورمنس خوبی نداره.
https://msdn.microsoft.com/en-us/library/gg696248.aspx
https://msdn.microsoft.com/en-us/library/ms668604.aspx
https://msdn.microsoft.com/en-us/data/jj592872

negar.rafie
دوشنبه 01 شهریور 1395, 13:33 عصر
ممنون
من از data binding استفاده میکنم ونیاز دارم
حالا حذف و ویرایش و اضافه کردن رکورد باLocal انجام بگیره فرقی نداره با حالتی که از local استفاده نکنیم؟
اگر فرق داره فرقش چیه؟واز کدوم استفاده کنیم


و اینکه منظورتون از این جمله چیه؟
ObservableCollection برای مجموعه های بزرگ پرفورمنس خوبی نداره.
یعنی برای حجم بالای تعداد رکورد نباید از local استفاده کرد؟پس از چی استفاده کنیم؟

Mahmoud.Afrad
دوشنبه 01 شهریور 1395, 14:09 عصر
فرض کنید رکورد(ها)ی دارای کد 100 در دیتابیس موجود است.

حال شرطی را قبل از فراخوانی متد Load اعمال و فقط تعدادی از رکوردها را لود کنیم نه همه آنها را
db.tbl1.Local.Where(c => c.code == "50").Load();
در کد بالا فقط رکوردهای دارای کد 50 لود خواهند شد.

حال فرض کنید کد اول شما را اجرا کنیم.
var u = db.tbl1.Local.Where(c => c.code == "100").FirstOrDefault();
db.tbl1.Local.Remove(u);
در اینصورت چیزی از دیتابیس حذف نخواهد شد چون u برابر null است. چون کوئری جستجو روی Local انجام شده است و Local دارای آیتمی با این کد نیست.


حالا جستجو را روی همه رکوردها انجام دهیم
var u = db.tbl1.Where(c => c.code == "100").FirstOrDefault();
db.tbl1.Remove(u);
در اینصورت u رکوردی با کد 100 است.
البته می توانید u را از Local حذف کنید درست است که لوکال این آیتم را ندارد ولی روی db تاثیر خواهد گذاشت.


برای اطمینان از اینکه حذف حتما انجام میشه ، جستجو را روی دیتابیس انجام بدید(راه دوم)

و این هم مد نظرتون باشه از Local به عنوان یک فیلتر اولیه میتونید استفاده کنید و مانند کد اول فیلتر ثانویه انجام بدید.

negar.rafie
دوشنبه 01 شهریور 1395, 14:23 عصر
پس در اصل انجام اعمال حذف ویرایش و اضافه با استفاده از local و بدون استفاده از local به هر دو روش صحیح است و هیچ فرقی نداره
ممنون

Mahmoud.Afrad
دوشنبه 01 شهریور 1395, 14:49 عصر
در درج رکورد جدید تفاوت ندارند.
در آپدیت و حذف از Local باید مطمئن بشید نتیجه بدست آمده از جستجو null نباشد. اگر در رکوردهایی که به کاربر توسط Local نمایش میدید، حذف یا آپدیت انجام میدید مشکلی نخواهید داشت.

negar.rafie
دوشنبه 01 شهریور 1395, 15:02 عصر
واقعا ممنونم ازتون جناب Mahmoud.Afrad
واقعا باید ما به وجود شما و امثال شما در سایت افتخار کنیم و قدر شما را بدونیم
همیشه در اکثر تاپیک هایی که دوستان ایجاد میکنند و سوالات اینچنینی را پرسیدند شما به خوبی و کاملا حرفه ای راهنمایی کردید
بعضی سوالات مثل همین سوال را نمیشه با جستجو در سایت های خارجی به پاسخشون رسید و باید براشون تاپیک ایجاد بشه تا به صورت فارسی یکی مثل شما بیاد جواب بده
استاتید خوبی ما در سایت داریم که مثل شما با سواد هستند ولی خب خیلی کم به سایت سر میزنند
خدا خیرتون بده
و امیدوارم همیشه موفق باشید

negar.rafie
دوشنبه 01 شهریور 1395, 15:09 عصر
فقط به عنوان اخرین سوال
این کد موردی نداره که فیلتر را از local انجام بدیم و از جدول حذف کنیم:

var u= db.tbl1.Local.Where(c => c.code == "100").FirstOrDefault();
db.tbl1.Remove(u);

Mahmoud.Afrad
دوشنبه 01 شهریور 1395, 15:52 عصر
فقط به عنوان اخرین سوال
این کد موردی نداره که فیلتر را از local انجام بدیم و از جدول حذف کنیم:

var u= db.tbl1.Local.Where(c => c.code == "100").FirstOrDefault();
db.tbl1.Remove(u);

قبلا گفتم، بستگی داره چنین شئ ای در Local هست یا نه(اگر نباشه u برابر null میشه). اگر هست پس مشکلی ندارید. ولی برای اطمینان، در خط اول Local رو حذف کنید.