SaveChanges 不适用于 JsonResult 方法(更新信息)

SaveChanges not working on JsonResult method (UPDATE INFO)

问题基本上是保存更改方法不起作用(更新),该方法应该接收 3 个参数,项目 ID、用户 ID 和包含来自 UI 的更新信息的对象,但是代码似乎有问题,因为 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);
        }
    }

我的代码有什么问题? 提前致谢。

据我所知,您没有将项目添加到 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();

但你应该小心,因为如果你在检查它是否为 null 之前加载和跟踪具有相同 ID 的项目:

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

然后您将在保存期间收到错误消息,因为上下文已经在跟踪具有相同 ID 的项目,因此您可以删除该检查并仅检查它是否存在:

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

然后执行你的代码