SaveChanges не работает с методом JsonResult (ИНФОРМАЦИЯ ОБ ОБНОВЛЕНИИ) - PullRequest
0 голосов
/ 08 апреля 2019

Проблема в основном заключается в том, что метод Сохранить изменения не работает (обновление), метод должен получить 3 параметра, идентификатор элемента, идентификатор пользователя и объект, который содержит обновленную информацию из пользовательского интерфейса, однако код кажется чем-то плохимпотому что метод saveChanges () не работает.

Это мой код:

[HttpPost]
    [AllowAnonymous]
    public JsonResult UpdatePersonalData(int ItemId, int UserId, CND_PersonalData Item)
    {
        try
        {
            if (ModelState.IsValid)
            {
                using (var context = new DexusEntities())
                {
                    CND_PersonalData PersonalData = context.CND_PersonalData.Where(d => d.Id == ItemId && d.UserId == UserId).SingleOrDefault();
                    if (PersonalData == null)
                    {
                        /// Display bad request
                        /// User does not exist and/or is not activated
                        List<RootObject> rootObj = new List<RootObject>();
                        rootObj.Add(new RootObject
                        {
                            msg = "User/Item not found in our DB",
                            code = "error_07"
                        });
                        HttpContext.Response.StatusCode = 404;
                        HttpContext.Response.TrySkipIisCustomErrors = true;
                        JsonRes.Message = rootObj;
                        return Json(JsonRes, JsonRequestBehavior.AllowGet);
                    }
                    else
                    {
                        PersonalData = Item;
                        context.SaveChanges();
                        context.ChangeTracker.DetectChanges();
                        List<RootObject> rootObj = new List<RootObject>();
                        rootObj.Add(new RootObject
                        {
                            msg = "Information stored/updated successfully",
                            code = "success_05"
                        });
                        HttpContext.Response.StatusCode = 200;
                        JsonRes.Message = rootObj;
                        return Json(JsonRes, JsonRequestBehavior.AllowGet);
                    }
                }
            }
            else
            {
                List<RootObject> rootObj = new List<RootObject>();
                JsonRes.Issue = "The model is not correct";
                rootObj.Add(new RootObject
                {
                    msg = "Model is not valid",
                    code = "error_03"
                });
                HttpContext.Response.StatusCode = 403;
                HttpContext.Response.TrySkipIisCustomErrors = true;// Avoid issues in the HTTP methods
                JsonRes.Message = rootObj;
                return Json(JsonRes, JsonRequestBehavior.AllowGet);
            }
        }
        catch (Exception ex)
        {
            string err = ex.ToString();
            List<RootObject> rootObj = new List<RootObject>();
            JsonRes.Issue = err;
            rootObj.Add(new RootObject
            {
                msg = "Conflict with method, see issue description.",
                code = "error_08"
            });
            HttpContext.Response.StatusCode = 400;// Bad request
            HttpContext.Response.TrySkipIisCustomErrors = true;
            JsonRes.Message = rootObj;
            return Json(JsonRes, JsonRequestBehavior.AllowGet);
        }
    }

Что не так с моим кодом?Заранее спасибо.

1 Ответ

0 голосов
/ 08 апреля 2019

Как я вижу, вы не добавляете элемент в DbSet и не вызываете SaveChanges после:

При добавлении предмета вы должны поместить его в DbSet

context.CND_PersonalData.Add(item);
context.SaveChanges();

когда вы хотите обновить, просто вызовите SaveChanges после обновления загруженного объекта

    var PersonalData= context.CND_PersonalData.Where(d => d.Id == ItemId && d.UserId == UserId).SingleOrDefault();
 PersonalData.Name = item.Name;
PersonalData.Title = item.Title;
    context.SaveChanges();

Вы не можете просто присвоить переданный объект сущности, которую вы получили из БД, вам нужно изменить свойства. Если вы делаете это как вы, вы не меняли значения в загруженном объекте. Поэтому при вызове SaveChanges ничего не меняется. Вам нужно изменить свойства по одному.

Если вы не хотите этого делать, вы можете прикрепить свой элемент в БД, используя метод Attach для контекста.

context.Attach(item);
context.SaveChanges();

но вы должны быть осторожны, потому что, если вы загружаете и отслеживаете элемент с тем же идентификатором, что и вы, прежде чем проверять, является ли он пустым:

CND_PersonalData PersonalData = context.CND_PersonalData.Where(d => d.Id == ItemId && d.UserId == UserId).SingleOrDefault();
                    if (PersonalData == null)
                    {

тогда вы получите ошибку при сохранении, потому что контекст уже отслеживает элемент с тем же идентификатором, так что вы можете удалить эту проверку и просто проверить, существует ли она:

if (context.CND_PersonalData.Any(d => d.Id == ItemId && d.UserId == UserId))
   {

и затем выполните ваш код

...