سلام و شب بخیر خدمت استاد عزیزم جناب مدائنی
عیدتون مبارک
استاد میخواستم بپرسم طبق گفته های جنابعالی برای حذف و ویرایش در Entity framework ابتدا باید اون سطری که میخوایم از جدول حذف بشه یا ویرایش بشه رو براساس کلید اصلی واکشی کنیم و در یک متغیر از نوع کلاس(معادل جدول در بانک) بریزیم
1.برای این واکشی چه زمانی از find و چه زمانی از SingleOrDefault باید استفاده کرد؟ چه تفاوتی باهم دارن؟
برای حذف و ویرایش از کدوم متد بهتره برای واکشی استفاده کنیم؟
ممنون میشم راهنمایی کنید
سلام خدمت شما دوست عزیز
بااجازه مهندس مدائنی میخواستم در مورد سوال شما چند نکته رو خدمتتون توضیح بدم
ببینید دوست عزیز اگر شما توی مرحله حذف و یا ویرایش باشید باید id آیتم رو از سمت کلاینت به کنترلرتون پاس بدید و این یعنی اینکه قطعا این id در بانک شما وجود داره و دستور find باید به درستی کار خودش رو انجام بده
حالا یک مورد میمونه و اون هم شیطنت های کاربر هستش
فرض کنید شما یک سیستم درست کردید که بر اساس نقش به کاربران فقط بخشی از آیتم هارو نمایش میدید
حالا فرض کنید من کاربر میام و id رو در سمت کلاینت تغییر میدم مثلا 1 رو به 10 تغییر میدم و در این حالت شما آیتم شماره 10 رو بجای آیتم شماره 1 حذف و یا ویرایش میکنید.
خوب این میتونه توی سیستم شما فاجعه بوجود بیاره
بنده توی پروژه های خودم معمولا توی تمام جداولم درکنار id از یک فیلد دیگه که جنس اون guid هستش استفاده میکنم و برای ویرایش و حذف بجای استفاده از id از guid استفاده میکنم در این حالت کاربر حتی اگر شیطنتی هم بکنه دستش به جایی بند نیست و نمیتونه کاری بکنه ولی توی این مورد باید بجای find از SingleOrDefault استفاده کرد
امیدوارم تونسته باشم بهتون کمک کنم
سپاس از شما دوست عزیز بابت پاسخگویی
فقط اگر امکان داره و زحمتی نیست راجع به اون شیطنت کاربر و Guid توضیحات بیشتری بفرمایید، خیلی خوب متوجه نشدم
سپاس از جنابعالی
خواهش میکنم
ببینید فرض کنید شما یک جدول (منظورم جدول 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 استفاده کرد
امیدوارم متوجه منظورم شده باشید باز هم اگر سوالی داشتید در خدمتم
بی نهایت سپاسگزارم
جالب بود
یعنی شما میفرمایید برای کلید ها در هر برنامه ای ما از guid استفاده کنیم که یه مقدار منحصر بفرد تولید میکنه نه از اعداد 1 و 2 و... که به راحتی قابل تغییر هستن؟
سوال بعد اینکه اگر این مقدار منحصر به فرد هم دستکاری بشه امکان اینکه مقدار دستکاری شده قبلا کلید بوده باشه نیست؟؟
و اگر از guid استفاده کنیم باید حتما از singleOrDefault هم استفاده بشه؟ find جوابگو نیست؟
عذرخواهی هم میکنم اگر تعداد سوالات زیاد شد
خواهش میکنم انجام وظیفه بود
ببینید دوست عزیز من فیلد id رو هم دارم و کلید اصلی جداول رو id قرار دادم ولی درکنار این فیلد یک فیلد guid هم قرار دادم و از طریق اون جلوی دستکاری های کاربر رو میگیرم
درصورتی که فیلد guid شما کلید اصلی جداولتون باشه میتونید از find استفاده کنید ولی بنده چون کلید اصلیم رو id قرار دادم و از guid بعنوان فیلد کمکی استفاده میکنم نمیتونم برای جستجوی guid از find استفاده کنم و به همین خاطر باید از SingleOrDefault استفاده کنم
درضمن guid توسط اطلاعات زمانی و مشخصات سیستمی تولید میشه و طول اون هم زیاده و به همین دلیل امکان تکراری بودن اون وجود نداره و احتمال اینکه بصورت تصادفی با دستکاری و شیطنت کاربر مقدار اون با یکی از guid های موجود در جدول ما یکی بشه خیلی خیلی خیلی ... خیلی کمه
اگر سوالی داشتید واقعا خوشحال میشم که بتونم کمکتون کنم
از بزرگی ولطف شما سپاسگزارم
درواقع شما برای واکشی اطلاعات از اون guid (که کلید اصلی نیست ولی منحصر به فرد هست) استفاده میکنید؟
خواهش میکنم
بله درسته البته فقط برای ویرایش و حذف
خیلی ازتون ممنونم، واقعا استفاده کردم، بسیار سپاس از توضیحات و وقتی که گذاشتید
خواهش میکنم
انشالا که تونسته باشم کمکتون کنم
موفق باشید