• 1399/03/05

Find و SingleOrDefault :

سلام و شب بخیر خدمت استاد عزیزم جناب مدائنی

عیدتون مبارک

استاد میخواستم بپرسم طبق گفته های جنابعالی برای حذف و ویرایش در Entity framework ابتدا باید اون سطری که میخوایم از جدول حذف بشه یا ویرایش بشه رو براساس کلید اصلی واکشی کنیم و در یک متغیر از نوع کلاس(معادل جدول در بانک) بریزیم

1.برای این واکشی چه زمانی از find و چه زمانی از SingleOrDefault باید استفاده کرد؟ چه تفاوتی باهم دارن؟ 

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

ممنون میشم راهنمایی کنید 

  • 1399/03/05
  • ساعت 12:05

سلام خدمت شما دوست عزیز 

بااجازه مهندس مدائنی میخواستم در مورد سوال شما چند نکته رو خدمتتون توضیح بدم

ببینید دوست عزیز اگر شما توی مرحله حذف و یا ویرایش باشید باید id آیتم رو از سمت کلاینت به کنترلرتون پاس بدید و این یعنی اینکه قطعا این id در بانک شما وجود داره و دستور find باید به درستی کار خودش رو انجام بده

حالا یک مورد میمونه و اون هم شیطنت های کاربر هستش

فرض کنید شما یک سیستم درست کردید که بر اساس نقش به کاربران فقط بخشی از آیتم هارو نمایش میدید

حالا فرض کنید من کاربر میام و id رو در سمت کلاینت تغییر میدم مثلا 1 رو به 10 تغییر میدم و در این حالت شما آیتم شماره 10 رو بجای آیتم شماره 1 حذف و یا ویرایش میکنید.

خوب این میتونه توی سیستم شما فاجعه بوجود بیاره

بنده توی پروژه های خودم معمولا توی تمام جداولم درکنار id از یک فیلد دیگه که جنس اون guid هستش استفاده میکنم و برای ویرایش و حذف بجای استفاده از id از guid استفاده میکنم در این حالت کاربر حتی اگر شیطنتی هم بکنه دستش به جایی بند نیست و نمیتونه کاری بکنه ولی توی این مورد باید بجای find از SingleOrDefault استفاده کرد

 

امیدوارم تونسته باشم بهتون کمک کنم


  • 1399/03/05
  • ساعت 12:11

سپاس از شما دوست عزیز بابت پاسخگویی 

فقط اگر امکان داره و زحمتی نیست راجع به اون شیطنت کاربر و Guid توضیحات بیشتری بفرمایید، خیلی خوب متوجه نشدم

سپاس از جنابعالی 

 


  • 1399/03/05
  • ساعت 18:11

خواهش میکنم

ببینید فرض کنید شما یک جدول (منظورم جدول html هستش) رو توسط یک حلقه برای نمایش به کاربر تولید کردید و برای edit , delete دوتا دکمه قرار دادید که هردو فیلد id رو بعنوان پارامتر به اکشن های مربوطه ارسال میکنند

حالا من که کاربر این سیستم هستم میام و با یک Inspect Element کردن ساده id ارسالی رو تغییر میدم

من توی پروژه های خودم در همچین مواردی معمولا از Guid استفاده میکنم که خود مایکروسافت اعلام کرده که هیچوقت نمیتونه تکراری باشه و تاحالا هم مورد تکراری و مشابهی رو تولید نکرده

توی سی شارپ این کد میتونه براتون یک GUID تولید کنه

Guid.NewGuid();

بعنوان مثال مقداری که در خط بعدی قرار دادم یک guid هستش

cfc59864-789e-462b-819d-a84876f803af

مقدار بالا جدای بر اینکه هیجوقت تکراری نمیشه قابل تغییر هم نیست ینی اگر من بیام و بخشی از این کد رو تغییر بدم احتمال اینکه این کد به مشخصه یک آیتم دیگه تبدیل بشه نیست و در این حالت کاربر نمیتونه مقادیر رو تغییر بده

 

دوتا آدرس زیر رو با هم مقایسه کنید متوجه منظور من میشید

www.xxx.com/ControllerName/ActionName/2
www.xxx.com/ControllerName/ActionName/cfc59864-789e-462b-819d-a84876f803af

همونجوری که میبینید مقدار 2 رو میشه تغییر داد و cfc59864-789e-462b-819d-a84876f803af رو نمیشه دستکاری کرد.

ولی درکل متد find برروی کلید کار میکنه و من از guid بعنوان کلید استفاده نکردم پس در این روش باید از متد singleOrDefault استفاده کرد

امیدوارم متوجه منظورم شده باشید باز هم اگر سوالی داشتید در خدمتم


  • 1399/03/05
  • ساعت 19:24

بی نهایت سپاسگزارم 

جالب بود

یعنی شما میفرمایید برای کلید ها در هر برنامه ای ما از guid استفاده کنیم که یه مقدار منحصر بفرد تولید میکنه نه از اعداد 1 و 2 و... که به راحتی قابل تغییر هستن؟ 


  • 1399/03/05
  • ساعت 19:27

سوال بعد اینکه اگر این مقدار منحصر به فرد هم دستکاری بشه امکان اینکه مقدار دستکاری شده قبلا کلید بوده باشه نیست؟؟ 

 

و اگر از guid استفاده کنیم باید حتما از singleOrDefault هم استفاده بشه؟ find جوابگو نیست؟ 

 

عذرخواهی هم میکنم اگر تعداد سوالات زیاد شد


  • 1399/03/05
  • ساعت 21:25

خواهش میکنم انجام وظیفه بود

ببینید دوست عزیز من فیلد id رو هم دارم و کلید اصلی جداول رو id قرار دادم ولی درکنار این فیلد یک فیلد guid هم قرار دادم و از طریق اون جلوی دستکاری های کاربر رو میگیرم

 

درصورتی که فیلد guid شما کلید اصلی جداولتون باشه میتونید از find استفاده کنید ولی بنده چون کلید اصلیم رو id قرار دادم و از guid بعنوان فیلد کمکی استفاده میکنم نمیتونم برای جستجوی guid از find استفاده کنم و به همین خاطر باید از SingleOrDefault استفاده کنم

 

درضمن guid توسط اطلاعات زمانی و مشخصات سیستمی تولید میشه و طول اون هم زیاده و به همین دلیل امکان تکراری بودن اون وجود نداره و احتمال اینکه بصورت تصادفی با دستکاری و شیطنت کاربر مقدار اون با یکی از guid های موجود در جدول ما یکی بشه خیلی خیلی خیلی ... خیلی کمه

 

اگر سوالی داشتید واقعا خوشحال میشم که بتونم کمکتون کنم


  • 1399/03/05
  • ساعت 22:02

از بزرگی ولطف شما سپاسگزارم 

درواقع شما برای واکشی اطلاعات از اون guid (که کلید اصلی نیست ولی منحصر به فرد هست) استفاده میکنید؟ 


  • 1399/03/05
  • ساعت 22:44

خواهش میکنم 

بله درسته البته فقط برای ویرایش و حذف


  • 1399/03/06
  • ساعت 01:38

خیلی ازتون ممنونم، واقعا استفاده کردم، بسیار سپاس از توضیحات و وقتی که گذاشتید 


  • 1399/03/06
  • ساعت 09:11

خواهش میکنم 

انشالا که تونسته باشم کمکتون کنم

موفق باشید


logo-enamadlogo-samandehi