saving_Related_DataHandling #Concurrency_Confilict #Transactions #disconnected_Entities

ذخیره و ویرایش داده ها در دیتا بیس با استفاده از ef

از این روش برای add استفاده میکنیم #Add #saveChanges

اینطوری میایم لود میکنیم و بعد ادیتش میکنیم

اینطوری هم remove میکنیم : #find #remove

یه راه دیگه هم هست

اینطوری میتونیم remove کنیم #Update

خوب اینجا دقت کنید برای این که بتونیم دیتا ها رو پاک کنیم میایم به جای find کردنش از new استفاده میکنیم و بعد با استفاده از دادن کلید اصلی اون چیزی که میخوایم پاک کنیم رو بهش میدیم و تمام پاک میشه

نکته : اگر بعد از چندین تا تغییر هم بیایم از save changes استفاده کنیم تمامی اون تغییرات اعمال میشن

برای آپدیت کردن هم از این کد استفاده میکنیم :

خوب حالا یه نکته ای که وجود داره اینه که میتونیم همون جایی که میخوایم category رو اضافه کنیم همون جا هم بیایم و بهش عضو product رو هم بدیم ، لازم نیست که حتما جدا جدا این کار رو بکنیم

حالا این رو در نظر بگیرید که از قبل یه دیتابیسی داریم حالا توی این حالت این کار رو میکنیم #include #first

خوب برای این که بیایم و به یه دیتابیسی که وجود داره category اضافه کنیم هم از این راه استفاده میکنیم :

واینجا ما اومدیم realation یکی از product ها رو به category جدید تغییر دادیم

خوب حالا برای این که بتونیم یه product رو از یه category حذف کنیم از این راه باید استفاده کنیم:

اگر داریم دیتایی رو پاک میکنیم باید حواسمون باشه که اون دیتا cascade هستش یا خیر

مبحث concurency confilict یعنی دسترسی چندین کلاینت به یک دیتا ، فرض کنید که از یک محصول فقط 1 عدد داریم بعد 3 نفر همزان میزنن برای خریدش و اینجاست که به مشکل میخوریم #timestamp #Concurrency_Confilict

isRowVersion خوب اینحا این دستور isRowVerstion داستانش این هستش که هر وقت دیتا هر جایی هر طوری تغییر کنه این متغییر ها به صورت اتوماتیک آپدیت میشه ، این تغییرات چه از دیتا بیس باشه و یا چه در برنامه اتفاق بیوفته این پارامتر آپدیت میشه

خوب اینجا توی دیتابیس یه فیلد اضافه شده که فقط توسط خوده دیتابیس تغییر میکنه

خوب برای این که این رو بیایم شبیه سازی کنیم توی برنامه میایم این کار رو میکینم اول توی دیتا بیس تغییرات رو ایجاد میکنیم :

خوب حالا وقتی که میخوایم توی برنامه اون مقدار رو آپدیت کنیم این اتفاق میوفته :

این پیام داره میگه که دیتایی که داری دیگه Valid نیستش چون یا تغییر کرده یا حذف شده خوب برای این که از کار جلوگیری کنیم یا هندلش کنیم میای این کار رو میکنیم :

currentValue #GetDatabaseValues خوب اول میایم اسم اون اروری رو که بهمون داده رو مینویسیم توی Catch بعد میایم میگیم توی اون ex دیتاهایی که ما میخواستیم ذخیره شون کنیم رو ازش میگیریم با استفاده از ex.entries و با entity بهش دسترسی پیدا میکنیم خوب بعدش شرط تعیین میکنیم و میگیم که اگر اون entity از نوع category بود بیا و یه سری کار روش انجام بده خوب با استفاده از currentValues میایم و مقداری که توی برنامه هست رو میگیریم و با استفاده از getDatabaseValues میایم دیتایی که توی دیتا بیس هستش رو میگیریم

#orginalValues #DbUpdateConcurrencyException

خوب حالا نکات

اینجا ما چون فقی یه entity رو میخوایم براش save changes انجام بدیم فقط همون یک entity رو داره اینجان نشون میده اگر چند تا بود چند تا میومد اینجا خوب current value اینجا اینطوری میشه :

این دو تای بالا میشن همون current value خوب میایم دیتای دیتا بیس رو هم میگیریم :

خوب ما برای تست این رو تغییر دادیم :

خوب حالا اینجا میاد و id رو هم در برنامه و هم در دیتا بیس میگیره :

خوب توی همین foreeach میاد پراپرتی بعدی رو هم میگیره که میشه name که همونطوری که میدونیم خودمون در دیتابیس این پراپرتی رو تغییر دادیم

در مرحله بعدی میاد timestamp رو هم میگیره که timestamp هم متفاوت خواهد بود

setValues خوب در آخر میاد مقادیری که توی دیتابیس هستش رو و اون رو گرفته میاد در دیتابیس اون رو دوباره ذخیره میکنه برای این که timestamp اش آپدیت بشه

خوب حالا برای این که بیایم یه سفارش و پرداخت رو بزاریم توی ایت باید اول entity اش رو تعریف کنیم:

برای pay هم همینه پراپرتی هاش

خوب توی این حالت اگر پرداخت ناقص انجام بشه و سفارش هم در دیتابیس ذخیره بشه به مشکل میخوریم، خوب برای همین راه حل برای رفع مشکلش اینطوریه که بیایم دیتا سفارش و پرداخت رو با هم در دیتابیس ذخیره کنیم خوب save changes یه قابلیتی داره اونم اینه که وقتی که ما داریم به طور مثال چند تا جدول رو که به هم وصل هستند رو میخوایم یک جا وارد دیتابیس کنیم اگر یکشون مشکل داشته باشه ، این قابلیت save changes میاد roll back میکنه دیتابیس رو

اینجا به طور مثال همه با هم اجرا میشن ولی اگر مشکلی پیش باید میاد data ها رو roll back میکنه

خوب یه راه دیگه هم هست اگر بخوایم دستی این کار رو انجام بدیم :

خوب اینجا داستانش اینطوریه که درسته که Save changes داره ولی نمیره قطعی اون دیتا رو ذخیره کنه

دیتا میاد توی snap shot ef core اول ذخیره میشه و بعد اگر ما دستور کامیت رو اجرا کنیم میاد همه اون ها رو وارد دیتابیس میکنه

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

خوب یه دستور دیگه هم که داریم

این هستش که یعنی ما میتونیم با استفاده از commit و roll back خودمون به صورت دستی بیایم دیتا ها رو هندل کنیم

نکته : فقط entity هایی که track شدن رو ما میتونیم تغییرشون بدیم اگر track نشده باشن نمیتونیم ادیتشون کنیم و یا دیتا بیس ذخیره شون کنیم

خوب مصلا این در نظر بگیریم که میخوایم یه محصول رو ویرایش کنیم در سایت ، خوب اول برنامه میره یه query میزنه به دیتا بیس و اون اطلاعات رو میگیره و بعد میاره به clinet نشون میده ، اینجا نیازی نداریم که دیتا رو track کنیم ، چرا؟ چون فقط بعد از این که کاربر میاد و دیتا رو تغییر میده و میخواد بفرسته سمت دیتا بیس این جاست که باید track اش کنیم چون میخوایم این دیتا رو وارد دیتا بیس کنیم، ولی در مورد قبلی نیازی نیست خوب توی این حالت ما باید بیام دیتایی که میخواد تغییر کنه رو از توی دیتابیس find کنیم و بیاریمش و بعد تغییرات رو روش اعمال کنیم و بعد ذخیره اش کنیم خوب query که نیاز به edit و حذف نداره رو track نکنیم