• 1397/07/22

مشکل نگهداری Session ها :

سلام و عرض ادب

من در مورد ویرایش موجودیت هایی که دارای رابطه هستند به مشکلی برخورد کرده م و اونو تا حدودی حل کردم ولی از اینکه راه حل درستی استفاده کردم مطمئن نیستم.

دو تا موجودیت داریم Service و ServiceVersion که اولی پرنت دومی میباشد به صورتی که از هر سرویس می توان نسخه های متعددی نسخه داشت.

به ازای هر Service یک سری فیلد ها در جدول ُServiceVersion هستند که باید مقدار یکتا داشته باشند . و هنگام درج کلیه این شرایط چک می شود. مشکل من در هنگام آپدیت است که باز هم یکتا بودن این مقادیر قایل تغییر باید دوباره چک شود. به این منظور من مقادیر قبلی رو در Session  ذخیره کردم و اون رو با مقادیر جدیدی که برای ویرایش ارسال می شوند مقایسه میکنم و اگر تغییر کرده بودند روی آنها همان شرایط یکتا بودن را چک میکنم. و ادامه ماجرا ...

public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            ServiceVersion serviceVersion = _serviceVersionRepository.Find(id);
            if (serviceVersion == null)
            {
                return HttpNotFound();
            }
            ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
            Session["ServiceEnglishName"] = serviceVersion.EnglishName;
            Session["ServicePersianName"] = serviceVersion.PersianName;
            Session["ServiceVersionNumber"] = serviceVersion.VersionNumber;
            Session["ServiceVersionURL"] = serviceVersion.URL;
            Session["ServiceVersionServiceId"] = serviceVersion.ServiceId;
            return View(serviceVersion);
        }

 

متد پست

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(ServiceVersion serviceVersion)
        {
            if (ModelState.IsValid)
            {
                if (serviceVersion.ServiceId == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                if (Session["ServiceVersionServiceId"].ToString() != serviceVersion.ServiceId.ToString())
                {
                    if (IsServcieVersionEnglishNameExist(serviceVersion.EnglishName, serviceVersion.ServiceId.Value))
                    {
                        ModelState.AddModelError("EnglishName", "این نام نسخه سرویس قبلا ثبت شده است");
                        ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                        return View();
                    }
                    if (IsServcieVersionPersianNameExist(serviceVersion.PersianName, serviceVersion.ServiceId.Value))
                    {
                        ModelState.AddModelError("PersianName", "این نام نسخه سرویس قبلا ثبت شده است");
                        ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                        return View();
                    }
                    if (IsServcieVersionVersionNumberExist(serviceVersion.VersionNumber, serviceVersion.ServiceId.Value))
                    {
                        ModelState.AddModelError("VersionNumber", "این شماره نسخه سرویس قبلا ثبت شده است");
                        ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                        return View();
                    }
                    if (IsServcieVersionURLExist(serviceVersion.URL, serviceVersion.ServiceId.Value))
                    {
                        ModelState.AddModelError("URL", "این آدرس نسخه سرویس قبلا ثبت شده است");
                        ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                        return View();
                    }
                }
                else
                {

                    if (serviceVersion.EnglishName != Session["ServiceEnglishName"].ToString())
                    {
                        if (IsServcieVersionEnglishNameExist(serviceVersion.EnglishName, serviceVersion.ServiceId.Value))
                        {
                            ModelState.AddModelError("EnglishName", "این نام نسخه سرویس قبلا ثبت شده است");
                            ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                            return View();
                        }
                    }
                    if (serviceVersion.PersianName != Session["ServicePersianName"].ToString())
                    {
                        if (IsServcieVersionPersianNameExist(serviceVersion.PersianName, serviceVersion.ServiceId.Value))
                        {
                            ModelState.AddModelError("PersianName", "این نام نسخه سرویس قبلا ثبت شده است");
                            ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                            return View();
                        }
                    }
                    if (serviceVersion.VersionNumber != Session["ServiceVersionNumber"].ToString())
                    {
                        if (IsServcieVersionVersionNumberExist(serviceVersion.VersionNumber, serviceVersion.ServiceId.Value))
                        {
                            ModelState.AddModelError("VersionNumber", "این شماره نسخه سرویس قبلا ثبت شده است");
                            ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                            return View();
                        }
                    }
                    if (serviceVersion.URL != Session["ServiceVersionURL"].ToString())
                    {
                        if (IsServcieVersionURLExist(serviceVersion.URL, serviceVersion.ServiceId.Value))
                        {
                            ModelState.AddModelError("URL", "این آدرس نسخه سرویس قبلا ثبت شده است");
                            ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                            return View();
                        }
                    }
                }

                ServiceVersion srvv = _serviceVersionRepository.Update(serviceVersion);
                if (srvv != null)
                {
                    Session.Remove("ServiceEnglishName");
                    Session.Remove("ServicePersianName");
                    Session.Remove("ServiceVersionNumber");
                    Session.Remove("ServiceVersionURL"); 
                    Session.Remove("ServiceVersionServiceVersionServiceId"); 
                    return RedirectToAction("Index");
                }
                else
                {
                    ViewBag.ErrorMessage = "خطا در ویرایش کردن نسخه سرویس جدید";
                    ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
                    return View();
                }
            }

            ViewBag.ServiceId = new SelectList(_serviceRepository.Get(), "Id", "EnglishName", serviceVersion.ServiceId);
            return View(serviceVersion);
        }

 

 

الان کد من جواب میده فقط اگر تعداد یوزر های من بالا بره این تعداد بالای Session در آینده برای من مشکل ایجاد نمیکنه؟ باید تایم سیشن ها را مشخص کنم؟ اگر لازم داشتم در چند جای مختلف از سشن استفاده کنم چی؟ می توان چند نوع سشن با طول عمر متفاوت ایجاد کرد؟

  • 1397/07/22
  • ساعت 16:31

دنبال یک روش بهتر و تمیز تر برای چک کردن شرایط هستم . چون این کد تا حدودی اصل DRY رو رعایت نکرده.


  • 1397/07/22
  • ساعت 16:40

آیا این راه حل باگ دارد؟

اگر کاربر صحفه ویرایش را باز کند و آن را همانگونه ببندد بدون آنکه کلید ویرایش را بزند . آیا سشن ها پاک می شوند؟


  • 1397/07/22
  • ساعت 17:12

اگر کاربر برای ویرایش چند تب باز کنه چی ؟ سشن ها به تداخل میخوره 

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


  • 1397/07/23
  • ساعت 08:59

ممنون استاد
این رو در نظر نگرفته بودم

 


  • 1397/07/23
  • ساعت 11:05

مشکل رو اینجوری حل کردم

هنگام آپدیت وقتی یک فیلد یونیک رو می خوام چک کنم اون رو به همراه Id خودش چک می کنم و در مورادی ک ارتباط وجود دارد، در این چک کردن id پدرش را هم در نظر می گیرم

public bool IsNationalCodeExist(string nationalCode)
{
return db.Organization.Any(c => c.NationalCode == nationalCode);
}

public bool IsNationalCodeExist(string nationalCode, int id)
{
return db.Organization.Any(c => c.NationalCode == nationalCode && c.Id != id);
}

 


logo-samandehi